ダッシュスクリプトの置換配列

ダッシュスクリプトの置換配列

このスクリプトは、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シェルで、またはvar11つ以上の変数が(空の文字列を含む任意の値に)設定されていることを確認するには、次の手順を実行します。var2var3

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コンピュータの競合なしに配列に何百万もの要素が含まれます。

おすすめ記事