次: , 前: Shell Substitutions, 上: Portable Shell


10.6 代入

列にいくつかの変数を設定するとき,評価の順序が定義されていないことを覚え ておいてください.例えば,`foo=1 foo=2; echo $foo'は,Solarisの shでは`1'になりますが,Bashでは`2'になります.順序を強 制するために`;'を使用する必要があります.`foo=1; foo=2; echo $foo'のようにします.

subdir/programを見つけるために,以下に依存しないようにしてくださ い.

     PATH=subdir$PATH_SEPARATOR$PATH program

これはZsh 3.0.6では動作しません.代わりに以下のようなものを使用してくだ さい.

     (PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)

代入の終了ステータスに依存しないようにしてください.Ash 0.2はステータス を変更せず,最後の文に伝搬します.

     $ false || foo=bar; echo $?
     1
     $ false || foo=`:`; echo $?
     0

そして,更に悪いことに,QNX 4.25はあらゆる場合で終了ステータス を0に設定します.

     $ foo=`exit 1`; echo $?
     0

デフォルト値を代入するために,以下のアルゴリズムを使用してください.

  1. デフォルト値がリテラルで閉じカッコを含まない場合は以下を使用してください.
              : ${var='my literal'}
         
  2. デフォルト値が閉じカッコを含まず,展開されず,初期化されている変数がIFS で分けられていない(すなわち,リストでない)場合,以下を使用してください.
              : ${var="$default"}
         
  3. デフォルト値が閉じカッコを含まず,展開されず,初期化されている変数がIFS で分けられる(すなわち,リストの)場合,以下を使用してください.
              var=${var="$default"}
         
  4. デフォルト値が閉じカッコを含む場合,以下を使用してください.
              test "${var+set}" = set || var='${indirection}'
         

ほとんどの場合,`var=${var="$default"}'で良いのですが,駄目なとき は後者を使用してください.正当性のための, `${var:-value}'と`${var=value}' の 項目は,See Shell Substitutions.