シェルスクリプトIF文、数値・文字列比較、ファイル・ディレクトリ存在判定
- Mon
- 22:03
- シェルスクリプト
シェルスクリプトのif文。数値や文字列、ファイル/ディレクトリの判定などいろいろできますが、オプションがややこしく。
ということで、メモ。
文字列の長さ判定
数値、文字列とも不等号記号(<、>)は使えない。>を使った場合、リダイレクトとして作用する。否定は、演算子の前に!(! -eq)。
また、文字列が未定義の場合はexpression expectedやoperator expectedなどのエラーがでる。この場合はダブルクォートで囲む必要がある。より古い書き方として、"X$STR" = "X" のようにされる場合もある。実行例は下記に。
if.sh
実行結果
-f、-d 以外はファイル・ディレクトリに利用可能。否定は、演算子の前に!(! -f)。
実行例は下記
実行結果
久々のネタは、超初歩的ifでご機嫌を伺ってみました。
ということで、メモ。
数値・文字列の判定
数値・文字列の共通演算子演算子 | 説明 |
-eq, = | 一致の場合、真 |
-ne, != | 不一致の場合、真 |
-gt | > |
-ge | >= |
-lt | < |
-le | <= |
文字列の長さ判定
演算子 | 説明 |
-z | 文字列長がゼロ場合、真 |
-n | 文字列長がゼロより大きい場合、真 |
数値、文字列とも不等号記号(<、>)は使えない。>を使った場合、リダイレクトとして作用する。否定は、演算子の前に!(! -eq)。
また、文字列が未定義の場合はexpression expectedやoperator expectedなどのエラーがでる。この場合はダブルクォートで囲む必要がある。より古い書き方として、"X$STR" = "X" のようにされる場合もある。実行例は下記に。
if.sh
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: | #!/bin/sh STR= TEST="str test1" if [ $STR = "" ]; then echo "$TEST: true" fi TEST="str test2" if [ "$STR" = "" ]; then echo "$TEST: true" fi |
$ ./if.sh ./if.sh: line 5: [: =: unary operator expected str test2: true |
ファイル・ディレクトリの判定
演算子 | 説明 |
-f | 対象がファイルの場合、真 |
-d | 対象がディレクトリの場合、真 |
-e | 対象が存在する場合、真 |
-r | 対象にread権限がある場合、真 |
-w | 対象にwrite権限がある場合、真 |
-x | 対象に実行権限がある場合、真 |
実行例は下記
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: | #!/bin/sh if [ -f file1.txt ]; then echo "file1.txt is file" fi if [ ! -f file1.txt ]; then echo "file1.txt is NOT file" fi if [ -d file1.txt ]; then echo "file1.txt is dir" fi if [ -d dir1 ]; then echo "dir1 is dir" fi if [ -e file1.txt ]; then echo "file1.txt exist" fi if [ -e dir1 ]; then echo "dir1 exist" fi |
user01@PC01[if_test]$ ll total 13 drwxr-xr-x+ 1 user01 None 0 Jul 21 21:55 . drwxr-xr-x+ 1 user01 None 0 Jul 21 20:38 .. d-wx-wx-wx+ 1 user01 None 0 Jul 21 20:39 dir1 -rw-r--r-- 1 user01 None 5 Jul 21 20:38 file1.txt -rwxr-xr-x 1 user01 None 1447 Jul 21 21:55 if.sh $ ./if.sh file1.txt is file dir1 is dir file1.txt exist dir1 exist |
久々のネタは、超初歩的ifでご機嫌を伺ってみました。