gpt4 book ai didi

bash - 在 shell 命令中使用循环时的错误消息

转载 作者:行者123 更新时间:2023-11-29 09:48:42 25 4
gpt4 key购买 nike

我做错了什么?

unset list
list=("A" "B" "C")
/bin/sh -c "for i in `seq 1 ${#list[@]}` ; do echo $i ; done "

它应该返回:

1
2
3

代替:

/bin/sh: -c: line 1: syntax error near unexpected token `2'
/bin/sh: -c: line 1: `2'

最佳答案

在您的原始代码中,您传递给 /bin/sh 的双引号字符串在调用 sh 之前由 shell 处理。特别是,涉及 seq 的命令替换和参数 $i 都被扩展了。结果,您得到以下信息(您可以在运行代码之前调用 set -x 来确认):

for i in 1
2
3 ; do echo ; done

1 之后的换行符被视为 for 将迭代的序列的终止。此时,sh 将期望关键字 do,但它看到的却是 2

假设您确实需要将字符串传递给 shell 的另一个实例,解决此问题的一种方法是告诉 seq 使用不同的分隔符(例如空格)。你需要逃跑$i 中的美元符号,以便它由子 shell 计算,而不是当前 shell。

unset list
list=("A" "B" "C")
/bin/sh -c "for i in `seq -s' ' 1 ${#list[@]}` ; do echo \$i ; done "

这将与 sh 一起工作,因为子 shell 看不到数组,它无论如何也不会理解。 sudo_O 提供了不同的答案,它涉及保护传递给 sh 的整个字符串,并在该字符串中包含 list 的定义,以便它在子 shell 中可见。请注意,您的 sh 必须是一个 shell,例如 bash,因为 POSIX sh 不支持数组,正如 jordanm 所指出的那样。

关于bash - 在 shell 命令中使用循环时的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com