初版作成 2008.7.24
最終更新 2024.04.01
ナツメ社 「Unix ツールハンドブック」 p.191〜 が分かりやすい
alias ne='emacs -nw' alias sc='. ~/.bashrc' export PATH=.:$PATH export CDPATH=.:~:~/yokutukau-dir
代入するときは = の左右にスペースを空けてはいけない fname=$1
if [ "$fname" = "" ]; then
elif [ "$fname" != "abc" ]; then
elif [ $? -ne 0 ]; then
elif [ $? -eq 0 ]; then
elif [ $a = 5 ]; then
else
fi
$fname が空のときも考慮して "$fname" とするのが常套手段。
文字列の比較のとき = を使うとトラブルの元になる。
C 言語のように代入が行われることがある。
-eq を使う方が良いと思う。
文字列を " " で囲むと、中を展開する。
文字列を ' ' で囲むと、中を展開しない。
" をエスケープするときは ' を使う。
ファイルに関しては
-r $fname 存在し、読み込み可
-w $fname 存在し、書き込み可
-x $fname 存在し、実行可
-f $fname 存在し、ファイルである
-d $dir 存在し、ディレクトリである
! -f $fname 存在しない ( ! は否定 )
条件の and と or
-a and
-o or
command 新たにプロセスを作って command か sh-script を
実行し、次の行から実行再開
. sh-script sh-script ファイルをその場所にインクルードして実行
ゆえに、今定義されている変数は sh-script 内で有効
であり、sh-script 内で定義された変数は、今の
シェルスクリプトで有効
ただし、sh-script は path 変数で指定されている
パスを探す。
exec command シェルスクリプトを終了して commmand を実行
flist="aaa bbb ccc"
for fname in $flist
do
echo $fname
if [ $? -ne 0 ]; then
exit
fi
done
i=0
while [ $i -le 10 ]
do
if [ $i = 8 ]; then
break
fi
if [ $i = 3 ]; then
i=4
continue
fi
i=`expr $i + 1`
done
set -v で echo on
set +v で echo off
あるいは
set -x で echo on
set +x で ocho off
違いは、以下の通り
-v +v sh-script と同一内容が表示される。つまり空行も表示される
-x +x 実行したコマンドのみ表示され、コマンドの左に '+ ' が入る
あるいは関数を定義して
com(){
echo "$@"
$@
}
com cd /home
com ls
不要な部分を適宜コメントアウトする。
[n]<<[-] end
line 1
line 2
end
n はファイルディスクリプタ番号で、デフォルトは 0 ( 標準入力 )
<< の後に - を入れると、それ以降の各行の先頭にある
タブを全て取り除くという意味になる。
ls 1> file1 2> file2 1> は標準出力のリダイレクト 2> は標準エラー出力のリダイレクト 1 は省略可なので、標準出力のリダイレクトは > だけでよい。 ls > file 2>&1 とすると、標準出力と標準エラー出力の両方を file に落とす。 ここでの意味は [a]>&[b] で、a への出力を b へ向けるという意味。2>&1 とすると、 標準エラー出力を標準出力へ振り向けることになる ので、両方が同時にリダイレクトできる。
$? 例 if [ $? -eq 0 ] then .... fi if [ $? -ne 0 ] then .... fi
read a echo \$a = $a
$0 コマンド名 $1 第 1 引数 $2 第 2 引数 $* or $@ 全て $# 引数の個数
$$
exit
script の 1 行目が #!/bin/sh で mode が 755 の とき、 % script a b c は以下のと等しい % sh script a b c