B shell の覚え書き

初版作成  2008.7.24
最終更新  2024.04.01


◆◆ 参考書 ◆◆


ナツメ社  「Unix ツールハンドブック」 p.191〜 が分かりやすい

◆◆ alias と環境変数 ◆◆


alias ne='emacs -nw'
alias sc='. ~/.bashrc'

export PATH=.:$PATH
export CDPATH=.:~:~/yokutukau-dir


◆◆ 代入文 ◆◆


   代入するときは = の左右にスペースを空けてはいけない

   fname=$1

◆◆ if 文 ◆◆


   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


◆◆ exec コメンド名 . ◆◆


   command        新たにプロセスを作って command か sh-script を
                  実行し、次の行から実行再開

   . sh-script    sh-script ファイルをその場所にインクルードして実行

                  ゆえに、今定義されている変数は sh-script 内で有効
                  であり、sh-script 内で定義された変数は、今の
                  シェルスクリプトで有効

                  ただし、sh-script は path 変数で指定されている
                  パスを探す。

   exec command   シェルスクリプトを終了して commmand を実行


◆◆ for 文 ◆◆


flist="aaa bbb ccc"

for fname in $flist
do
   echo $fname
   if [ $? -ne 0 ]; then
      exit
   fi
done


◆◆ while 文 ◆◆


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


◆◆ echo on と echo off ◆◆


   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 ( 標準入力 )
<< の後に - を入れると、それ以降の各行の先頭にある
タブを全て取り除くという意味になる。


◆◆ stdout stderr の両方をリダイレクト ◆◆


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