【问题标题】:Word splitting using multiple IFS使用多个 IFS 进行分词
【发布时间】:2014-11-15 10:15:00
【问题描述】:

作为 shell 脚本的新手,我不清楚 bash 中的引用和拆分概念。在下面的sn-p中:

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
Italy
country
belgium
country

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

【问题讨论】:

  • 如果您不想在连字符上拆分,为什么在 IFS 中有“-”。直接删除?

标签: bash split word ifs


【解决方案1】:

对于您的问题,您可以简单地将字段分隔符更改为:,即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 。所以在这个例子中我没有看到任何数组的使用。简单的变量就足够了。

【讨论】:

    【解决方案2】:

    此脚本展示了如何将冒号分隔的字符串拆分为 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) 的情况下,或者在使用 @987654331 执行测试时@ ... ]] 语法。

    我建议您将BashGuide 加入书签并浏览他们的常见问题解答。但是,真正了解 Bash 中引用和拆分的神秘方法的唯一方法是编写 很多 脚本。 :)

    您可能还会发现ShellCheck 很有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多