【问题标题】:iterating a list of strings with whitespace in POSIX sh在POSIX sh中迭代带有空格的字符串列表
【发布时间】:2018-06-22 11:29:54
【问题描述】:

我有两个字符串列表(每个字符串中都有空格),并且想要一个一个地读取它们。字符串的长度相同,所以我通过"${!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

【问题讨论】:

  • 不。那是在 bash 中。
  • 您不想使用 bash 吗?如果没有普通 sh 中的数组,要做到这一点非常困难。
  • 恕我直言,这无关紧要。这是一个标题和标签中带有 shell 的问题。我没有看到将其标记为重复的理由。
  • 在您的问题中应该提到限制对普通 sh 的回答,并且解释为什么您有这样的限制也是一个好主意。如今,Bash 是事实上的标准 shell。许多人说“shell”的意思是“bash”,所以值得明确的是你不这样做。我不是要争论,只是想帮助你得到好的答案。
  • 请参阅Arrays in UNIX shell? 了解 bash 解决方案。

标签: sh


【解决方案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 中的数组赋值(你称之为 list 在 bash 中称为 array)将遵循语法name=(val1 val2 ....)

【讨论】:

  • s/special case/case/ -- arguments="..." "..." 中不存在 V=X P 中不存在的行为。
猜你喜欢
  • 1970-01-01
  • 2011-03-10
  • 2020-01-04
  • 1970-01-01
  • 2018-12-05
  • 2013-10-16
  • 2018-09-16
  • 2015-01-01
  • 1970-01-01
相关资源
最近更新 更多