初版作成 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