位置パラメータを移動する必要がありますが、次のコマンドが機能するかどうかを知りたいです。
shift $((sft==2))
答え1
すべてのPOSIXシェルで動作します。
$IFS
拡張子を引用することを忘れないでください。それ以外の場合は分割+globの影響を受け、0
含まれている場合はエラーを返します1
。shift "$(( sft == 2 ))"
(内部スペースは必須ではなく、読みやすくするために追加しただけですが、通常、スペースは
bash -c 'echo "$((a-$1))"' bash -1
aを返すのと同じ効果があるため、bash: a--1: syntax error in expression (error token is "1")
算術式でスペースを使用することをお勧めします。)$sft
整数リテラル(前にゼロのない10進数または16進数)を含みます。前にゼロがある数字は、一部のシェルがこの要件を無視しますが、8進数として扱われます。 bashの場合は8進数で処理されるだけでなく、8桁または9桁の場合はエラーが返されます。$sft
2で位置引数が0の場合、エラーが発生するため、shift "$(( $# && sft == 2 ))"
これを回避できます。
$(( sft == 2 ))
0または1に拡張されます。POSIXshift
0を引数として受け入れ、この場合は何もしません。
これを書く他の方法は次のとおりです。
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