使用多个IFS进行单词分割

时间:2014-11-15 10:15:01

标签: bash split word ifs

作为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

如果有人可以指出我的理解错误,那就太好了。

2 个答案:

答案 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有帮助。