条件付き転送

条件付き転送

位置パラメータを移動する必要がありますが、次のコマンドが機能するかどうかを知りたいです。

shift $((sft==2))

答え1

すべてのPOSIXシェルで動作します。

  • $IFS拡張子を引用することを忘れないでください。それ以外の場合は分割+globの影響を受け、0含まれている場合はエラーを返します1

    shift "$(( sft == 2 ))"
    

    (内部スペースは必須ではなく、読みやすくするために追加しただけですが、通常、スペースはbash -c 'echo "$((a-$1))"' bash -1aを返すのと同じ効果があるため、bash: a--1: syntax error in expression (error token is "1")算術式でスペースを使用することをお勧めします。)

  • $sft整数リテラル(前にゼロのない10進数または16進数)を含みます。前にゼロがある数字は、一部のシェルがこの要件を無視しますが、8進数として扱われます。 bashの場合は8進数で処理されるだけでなく、8桁または9桁の場合はエラーが返されます。

  • $sft2で位置引数が0の場合、エラーが発生するため、shift "$(( $# && sft == 2 ))"これを回避できます。

$(( sft == 2 ))0または1に拡張されます。POSIXshift0を引数として受け入れ、この場合は何もしません。

これを書く他の方法は次のとおりです。

if [ "$#" -gt 0 ] && [ "$sft" -eq 2 ]; then
  shift
fi

$sft数値が含まれていることが保証されていない場合は、bashにコマンドインジェクションの脆弱性が発生する可能性があります。[[...]]算術比較演算子は、ゼロの前にある数字も小数として扱います。)$((...))((...))[

Kornに似たシェルには以下が含まれますbash

if (( $# && sft == 2 )); then
  shift
fi

または:

(( $# && sft == 2 )) && shift

(ただし、条件が満たされない場合、全体終了状態はゼロ以外の状態になり、(( $# == 0 || sft != 2 )) || shift問題が発生しませんのでご注意ください。)

zshから:

shift "$# && sft == 2"

(引数は算術式として解釈されます.)

または、短縮形式を使用してくださいif

if (( $# && sft == 2 )) shift

関連情報