このスクリプトは、Debian 11(bullseye)でbashを使用すると機能します。しかし、今はDebianのsh
シェル()を使用するようにリファクタリングする必要があります/bin/dash
。
#!/bin/dash
var1=1
var2=2
var3=3
arr=($var1 $var2 $var3)
exist_var="${arr[*]:+ message}"
echo $exist_var
変数が設定されると、メッセージが表示されます。
tuy@debian$ bash sh_array.sh
message
変数が設定されていない場合、メッセージは表示されません。
tuy@debian$ bash sh_array.sh
$
ダッシュは配列をサポートしていないことを知っています。変数が定義されている場合、スクリプトはメッセージを印刷する必要があります。変数が定義されていない場合、スクリプトは引き続き機能しますが、メッセージを印刷しません。
ベストアンサー1
dash、bash、または他のPOSIXシェルで、またはvar1
1つ以上の変数が(空の文字列を含む任意の値に)設定されていることを確認するには、次の手順を実行します。var2
var3
if [ -n "${var1++}${var2++}${var3++}" ]; then
echo At least one of those 3 are set
fi
または
set=${var1++}${var2++}${var3++}
echo "${#set} out of 3 of those variables are set"
Bashでも、あなたのコードは意味がありません。
*配列要素とその間の最初の文字の連結が空の文字列でない場合は"${arr[*]:+ message}"
拡張されます。" message"
arr
$IFS
以前は、arr
およびに適用する分割+globを定義しました。$var1
$var2
$var3
デフォルト値を使用すると、$IFS
これらの変数がすべて設定されているが空白、タブ、または改行のみが含まれている場合、分割セクションのためarr
に配列に要素がなくなります。var1
たとえば、に設定すると、/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*
glob部分によってarr
コンピュータの競合なしに配列に何百万もの要素が含まれます。