我循环从 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 没有命名arr
或var
定义变量,则参数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'