破折号脚本替换数组

破折号脚本替换数组

如果我在 Debian 11 (bullseye) 上使用 bash,这个脚本就可以工作。但现在我需要重构它以使用 Debian 的shshell( /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 中至少设置了var1var2var3变量之一(为任何值,包括空字符串),您可以这样做:

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

之前,您将arrsplit+glob 定义为应用于$var1$var2$var3

使用默认值$IFS,如果设置了所有这些变量但仅包含空格、制表符或换行符,则arr由于分割部分,数组最终将没有元素。var1例如,如果设置为/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*,由于 glob 部分,arr如果不使计算机崩溃,数组最终将包含数百万个元素。

相关内容