制御構文
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
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 [ ]; then
if [ nandemo ]; then
WARNING
BAD if 0; then ## ERR, invalid cmd
OK if test.sh; then ##
exit 0
条件文はひとつの式なので [ ; then ] と記述
すべてに TOKEN にスペースを空ける
空の 式 はできない.
BAD
if 条件文; then fi
BAD
if [ "$1"="str" ];
OK
if [ "$1" = "str" ];
OR.AND
if [ -f a.txt -a -f b.txt ]
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
シェルのファイル展開と併用する。
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
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
while read i
do
echo $i
done < /dust/foo.txt
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