作为shell脚本的新手,我不清楚bash中的引用和拆分概念。在下面的代码段中:
array1=("france-country":"Italy-country":"singapore-country")
echo ${#array1[@]}
IFS=":-"
for i in ${array1[@]}
do
echo "$i"
done
unset IFS
IFS为:-
,我认为结果是:
france-country
Italy-country
belgium-country
正如我所引用的那样(" france-country")。我认为不应该分开" - "。但结果是:
france
country
Italy
country
belgium
country
如果有人可以指出我的理解错误,那就太好了。
答案 0 :(得分:0)
对于您的问题,您只需将字段分隔符更改为:
,即IFS=:
,因为在您的示例中,每个国家/地区名称由:
而不是:-
分隔
array1=("france-country":"Italy-country":"singapore-country")
echo ${#array1[@]}
IFS=":"
for i in ${array1[@]}
do
echo "$i"
done
unset IFS
仅供参考,bash中的数组元素由space
分隔,因此整个字符串"france-country":"Italy-country":"singapore-country"
是数组的单个元素,因此echo ${#array1[@]}
始终为1
。所以我在这个例子中没有看到任何数组的使用。简单的变量就足够了。
答案 1 :(得分:0)
此脚本显示如何将冒号分隔的字符串拆分为Bash数组。
#!/usr/bin/env bash
words="france-country:Italy-country:singapore-country:Australia-country"
IFS=':' array1=($words)
numwords="${#array1[@]}"
for((i=0; i<numwords; i++));do
echo "$i: ${array1[i]}"
done
<强>输出强>
0: france-country
1: Italy-country
2: singapore-country
3: Australia-country
请注意
array1=($words)
我们不会在$words
附近加上引号,因为这会阻止分词。
我们实际上并不需要
中的引号words="france-country:Italy-country:singapore-country:Australia-country"
但如果该字符串中有任何空格,则需要 。同样,引号在numwords="${#array1[@]}"
中是多余的,许多Bash程序员会省略它们,因为我们知道${#array1[@]}
的结果永远不会有空格。
总是在Bash中使用引号是个好主意,除非你确定你不想要它们,例如在array1=($words)
以上的情况下,或者在执行测试时[[
... ]]
语法。
我建议你标记BashGuide并浏览他们的常见问题解答。但真正学习Bash中引用和分割的神秘方法的唯一方法是编写 lot 脚本。 :)
您可能还会发现ShellCheck有帮助。