#navi(../)


* 文字列の長さを調べる方法 [#ie493736]
シェルスクリプトで文字列の長さを調べたい場合は、以下の方法で取得することができます。
#contents
#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)

* 変数に格納されている文字列長を取得 [#n923e67e]
 ${#変数名}

- 実行結果
 $ hello="Hello world"
 $ echo ${#hello}
 11

* 変数に格納されていない文字列長を取得 [#o0f3bf78]
wcコマンドとexprコマンドを使用した2つの例を以下に記します。

** 変数に格納されていない文字列長を取得・その1(wcコマンド編) [#s3906008]
wcコマンドにより''バイト数''を取得できます。

- 実行結果~
echoコマンドの場合、改行コード分も含まれるので以下の実行結果となります。
 $ echo "hello world" | wc -c
 12
改行をしないように-nをつけると以下の実行結果となります。
 $ echo -n "hello world" | wc -c
 11

** 変数に格納されていない文字列長を取得・その2(exprコマンド編) [#m13b9f71]
exprコマンドにより文字列長を取得することもできます。
 expr length 文字列

- 実行結果~
 $ expr length "hello world"
 11

* ファイル内の各行の文字列長を取得する [#o5cfffc3]
以下のようなファイル内容の場合の例を記します。

 $ cat hello.txt 
 HELLO WORLD
 KONNICHIWA
 NIHAO

以下、wcコマンドとexprコマンドを利用した2つの例を記します。

** ファイル内の各行の文字列長を取得する(wcコマンド編) [#m94dce11]

 $ for L in `cat hello.txt`
 > do
 >   echo $L | wc -c
 > done
 6
 6
 11
 6

HELLO と WORLDの間にスペースがあるため、分割して表示されてしまいます。~
IFSの値を変更し行単位で動作するようにします。

IFSの値を変更することにより、行単位で動作するようになります。~
処理終了後、IFSの値をもとに戻しています。
 $ for L in `cat hello.txt`; do echo $L | wc -c; done
 $ IFS_BACKUP=$IFS
 $ IFS=$'\n'
 $ for L in `cat hello.txt`; do echo $L | wc -c; done
 12
 11
 6
 $ IFS=$IFS_BACKUP

上記の場合だと、改行コード分のバイト数が含まれているので echo -n とすれば以下の結果となります。
 $ IFS=$IFS_BACKUP
 $ IFS_BACKUP=$IFS
 $ IFS=$'\n'
 $ for L in `cat hello.txt`; do echo -n $L | wc -c; done
 11
 10
 5
 $ IFS_BACKUP=$IFS

** ファイル内の各行の文字列長を取得する(exprコマンド編) [#j80aec21]
上記のwcコマンド例と同様に、IFSを指定しないとスペースが区切り文字となってしまうので、IFSを設定して実行した結果です。~
改行文字はカウントされていないのがわかります。

 $ IFS_BACKUP=$IFS
 $ IFS=$'\n'
 $ for L in `cat hello.txt`; do  expr length $L; done
 11
 10
 5
 $ IFS_BACKUP=$IFS

* 関連記事 [#e7286b6d]
- [[逆引きシェルスクリプト/スペースが含まれる文字列を1行として扱う方法]]
- [[逆引きUNIXコマンド/整数演算を行う・exprコマンド]]

#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS