#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)