シェルスクリプトで文字列の長さを調べたい場合は、以下の方法で取得することができます。
${#変数名}
$ hello="Hello world" $ echo ${#hello} 11
wcコマンドとexprコマンドを使用した2つの例を以下に記します。
wcコマンドによりバイト数を取得できます。
$ echo "hello world" | wc -c 12改行をしないように-nをつけると以下の実行結果となります。
$ echo -n "hello world" | wc -c 11
exprコマンドにより文字列長を取得することもできます。
expr length 文字列
$ expr length "hello world" 11
以下のようなファイル内容の場合の例を記します。
$ cat hello.txt HELLO WORLD KONNICHIWA NIHAO
以下、wcコマンドとexprコマンドを利用した2つの例を記します。
$ 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
上記の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