sh -c 执行 shell 脚本时得不到正确的输出

sh -c 执行 shell 脚本时得不到正确的输出

我循环从 shell 中的数组获取数据,
当我在 shell 文件中执行它时它会工作,内容如下:

arr=(1 2 3 4 5)  
for var in ${arr[@]};  
do  
    echo $var  
done

sh -c但当我使用如下所示时没有任何输出:

sh -c "arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done"

答案1

您的问题是使用sh -c "...",请参阅@吉尔斯的回答更多细节。

更进一步,sh(参考POSIX sh)不支持数组(严格来说只有一个数组,$@),您需要调用系统上的其他 shell,它们支持bash,zsh或等数组ksh

bash -c 'arr=(1 2 3 4 5);for var in "${arr[@]}";do echo "$var"; done'

${arr[@]}另请注意,您在取消引用时犯了一个错误,实际上您需要for var in "${arr[@]}"改为。调用不带引号的变量调用 split+glob,这是许多安全隐患的来源

要使用 POSIX sh,您可以使用$@:

set -- 1 2 3 4 5
for var do
  printf '%s\n' "$var"
done

答案2

问题是您使用了错误的引号类型。 Shell 在双引号内插入变量,因此变量引用是由您运行的 shell 插入的sh -c "…"。假设该 shell 没有命名arrvar定义变量,则参数sh -c

arr=(1 2 3 4 5);for var in ;do echo ;done

如果sh是支持数组的 shell,那么这是完全有效的代码,但碰巧什么也不做。

要将文字字符串传递给命令,请使用单引号。单引号内的所有字符均按字面解释,因此您可以使用字符串中除单引号之外的所有字符。 (如果您需要单引号,将其转义为四字符序列'\''.)

sh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'

请注意,并非所有实现都sh支持数组。如果您需要数组,您应该显式调用支持它们的 shell。

ksh -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'

或者

bash -c 'arr=(1 2 3 4 5);for var in ${arr[@]};do echo $var;done'

相关内容