UNIX/Linuxの部屋 用語集:シェルスクリプト コマンド実行を自動実行するためのファイル (if/else/foreach/while/case/switch)


※空白区切りで AND 検索 (例:「ファイル 削除」)

用語集 シェルスクリプト コマンド実行を自動実行するためのファイル (if/else/foreach/while/case/switch)

シェルスクリプトは
#!/bin/sh
echo "Hello World"

#!/bin/csh -f
echo "Hello World"
などと、シェルが解釈できるコマンドを羅列したファイルのことを指す。

sh が解釈できるシェルスクリプトのことを「sh スクリプト」(エスエイチスクリプト)、csh が解釈できるシェルスクリプトのことを「csh スクリプト」(シーシェルスクリプト) と呼ぶことがある。

なお、シェルスクリプトのことを指して「シェル」と呼んではいけない。本人は略しているだけのつもりかもしれないが、端から見るとシェルとシェルスクリプトの区別が付いていないように見える。よくわかっていない人が
「ファイルが消えた原因はシェルのバグです」
と主張するとき、原因は sh や csh のバグではなく、ほとんどの場合その人が書いたシェルスクリプトのバグにすぎない。当ページ管理人のネット上・実社会での観測結果によると、「シェルスクリプト」を「シェル」と呼ぶ人のスキルは著しく低い傾向がある。

sh スクリプトも csh スクリプトも、コマンドを羅列するという点では共通であるが、シェルの内部コマンド・変数の扱い・パイプ・リダイレクトなどの点で大きな違いがある。以下に簡単な相違点をあげる。

シェル変数セット
sh:
hoge=FUGA
csh:
set hoge=FUGA

環境変数セット
sh:
HOGE=FUGA
export HOGE
export HOGE=FUGA (一部 sh・bash の方言)
csh:
setenv HOGE FUGA

変数参照・変数代入
sh:
echo $i
j=$i
csh:
echo $i
set j=$i

一定回数のループ
sh:
i=0
while [ $i -lt 5 ]; do
echo $i
i=`expr $i + 1`
done
csh:
set i=0
while ( $i < 5 )
echo $i
@ i = $i + 1
end

リスト処理
sh:
vars="x y z"
for var in $vars; do
echo $var
done
csh:
set vars=(x y z)
foreach var ($vars)
echo $var
end

行単位の処理
sh:
コマンド実行結果から:
ls -l | while read line; do
echo $line
done
ファイルから:
while read line; do
echo $line
done < file.txt
ヒアドキュメントで:
while read line; do
echo $line
done <<END
hoge
fuga
END
csh:
どうやるんだっけ?

コマンド実行結果のリスト処理
sh:
for file in `ls`; do
echo $file
done
csh:
foreach file (`ls`)
echo $file
end

if 文
sh:
if [ $var = "abc" ]; then
echo "var is abc"
elif [ $var = "def" ]; then
echo "var is def"
else
echo "var is not abc nor def"
fi
csh:
if ( $var = "abc" ) then
echo "var is abc"
else if ( $var = "def" ) then
echo "var is def"
else
echo "var is not abc nor def"
endif

continue・break
sh:
continue・break は for・while から脱出・次ループへ移動を行う。
cotinue 数字
break 数字
などとすることで、内側から何個目の for・while に対しての指示なのかを指定できる。
continue
continue 1

break
break 1
は、それぞれ等価である。
for file in `ls`; do
if [ $file = "hoge.txt" ]; then continue
if [ $file = "fuga.txt" ]; then break
done
csh:
continue・break は foreach・while から脱出・次ループへ移動を行う。csh の continue・break は、最も内側のループにしか効かない。
foreach file (`ls`)
if ( $file = "hoge.txt" ) then
continue
endif
if ( $file = "fuga.txt" ) then
break
endif
end

switch 文
sh:
case $var in
hoge)
echo "var is hoge"
;;
foo|bar)
echo "var is foo or bar"
;;
*)
echo "var is unknown"
;;
esac
csh:
switch ($var)
case "hoge":
echo "var is hoge"
breaksw
case "foo":
case "bar":
echo "var is foo or bar"
breaksw
default:
echo "var is unknown"
breaksw
endsw

Yes か No を答えさせる
sh:
while [ 1 ]; do
/bin/echo -n "Type Yes/No: "
read line
case $line in
[yY][eE][sS])
echo YES; break
;;
[nN][oO])
echo NO; break
;;
esac
done
csh:
どうやるんだっけ。


頑張って書いたおすすめコンテンツ!