制御構文





if


if 終了コード then cmd # 条件文(処理)の結果 == 0 の処理 elif 終了コード cmd # 条件文(処理)の結果 != 0 の処理 else cmd fi 条件によって処理を分岐したいときは test コマンドを使う。 test は式が真ならば終了コードの 0, 偽ならば 1 を返す。
v=1 if test $v = 1 then echo "true" fi # isFileExist # # ファイルの有無をテスト if test -f ~/.emacs then echo "true" fi
test の省略形として [] を使うこともできる。 ただし [] 内の前後は スペースを空ける必要がある。
if [ -f ~/.emacs ] then echo "true" fi
変数の値と比較するときは空がきた場合の対策で "" をつけておく if [ = "aaa" ] と解釈されて構文エラーになる。
if [ "$1" == "a" ] then echo "true" fi
POINT # if(0) if [ ]; then # if(1) if [ nandemo ]; then WARNING BAD if 0; then ## ERR, invalid cmd OK if test.sh; then ## # # test.sh exit 0
条件文はひとつの式なので [ ; then ] と記述 すべてに TOKEN にスペースを空ける 空の 式 はできない. BAD if 条件文; then fi BAD if [ "$1"="str" ]; OK if [ "$1" = "str" ];



OR.AND


# AND if [ -f a.txt -a -f b.txt ] # OR if [ -f a.txt -o -f b.txt ] i=10 j=1 if [ $i == 10 -a $j == 7 ]; then echo "true" else echo "false" fi



for


SYNTAX for $v in list do ... done スペース区切りの文字列 list 内の要素を変数 v に代入しながら繰り返す
list="a b c" for $v in list do echo $v done
シェルのファイル展開と併用する。
# すべての .txt を処理する for v in *.txt do echo $v done
引数をイテレートする
for v in $*; do echo $v done
コマンドの結果をイテレートする
for v in `find -iname "*.txt"`; do echo $v done # grep で検索された結果をイテレートする。 for v in `grep "TODO" ~/.emacs`; do echo $v done



while


SYNTAX while 条件文 do ... done
# [ : ] 区切りのパスを出力 list=$PATH while test -n "$list" do echo ${list%%:*} list=${list#*:} if [ "$list" == "${list#*:}" ]; then break; fi done
# file の各行をなめる while read i do echo $i done < /dust/foo.txt # STDIN から 入力 while read i do echo $i done



case


SYNTAX case 文字列 in 条件1) 処理1 ;; 条件2) 処理2 ;; 条件3) 処理3 ;; esac DESC 文字列一致した条件の処理をする。
v=a case $v in a) echo "a" ;; b) echo "b" ;; *) echo "default" esac
条件の文字列には シェルのワイルドカードが使える。 "*" は任意の文字列なのでデフォルトとして機能する。
v=a case $v in *.txt) echo "txt" ;; *.exe) echo "exe" ;; *) echo "default" esac
# ユーザーごとに処理をかえる case $USER in root) echo "root user" ;; *) echo "default" esac
while getopts a:bc var do case $var in a) echo a ;; # break b) echo b ;; *) # Default echo etc esac