如果我在 Debian 11 (bullseye) 上使用 bash,这个脚本就可以工作。但现在我需要重构它以使用 Debian 的sh
shell( /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
$
我知道 dash 不支持数组。如果定义了任何变量,脚本必须打印一条消息。如果没有定义变量,该脚本仍然可以工作,但不会打印消息。
答案1
如果您想检查是否在 dash、bash 或任何其他 POSIX shell 中至少设置了var1
、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
split+glob 定义为应用于$var1
、$var2
和$var3
。
使用默认值$IFS
,如果设置了所有这些变量但仅包含空格、制表符或换行符,则arr
由于分割部分,数组最终将没有元素。var1
例如,如果设置为/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*
,由于 glob 部分,arr
如果不使计算机崩溃,数组最终将包含数百万个元素。