我有两个字符串列表(每个字符串中都有空格),并且想要一一阅读。字符串的长度是相同的,因此我通过"${!argument[@]}"
得到了其中一个的长度,并尝试读取列表中的元素。但是失败了:
arguments="--a 100 --b 200" "--a 100 --b 200 --c"
settings="without_c" "with_c"
for index in "${!argument[@]}"
do
setting=${setting[$index]}
argument=${argument[$index]}
done
给出以下错误:
alp@ubuntu:~$ sh toy.sh
toy.sh: 1: toy.sh: --a 100 --b 200 --c: not found
toy.sh: 2: toy.sh: with_c: not found
toy.sh: 3: toy.sh: Bad substitution
答案 0 :(得分:1)
您的第一行内容为
arguments="--a 100 --b 200" "--a 100 --b 200 --c"
这是以下结构的特例:
V=X P
(V为arguments
,X为"--a 100 --b 200"
,P为--a 100 --b 200 --c
)。
这样的语句的语义是在环境变量V设置为X的环境中执行程序P。
在您的情况下,这意味着您要求外壳程序执行“程序” --a 100 --b 200 --c
,而这样的程序不存在。这就是错误消息的内容。
在标题中,您表示要处理列表,但是您使用的是不支持列表的编程语言(Posix shell)。您未在评论中声明使用bash,因为如果您使用bash,则错误消息会有所不同。
当然,即使在bash中,第一行也是不正确的,因为bash中的数组分配(在bash中称为 list 称为 array )将遵循语法name=(val1 val2 ....)
。