【问题标题】:Use of the Internal Field Separator when capturing array data from a command in a bash script从 bash 脚本中的命令捕获数组数据时使用内部字段分隔符
【发布时间】:2012-11-19 11:42:07
【问题描述】:

当我运行命令时

git cherry origin/Server_Dev

在我的 git 存储库中,我得到了表单的提交列表

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这是一件好事。

我现在想在 bash 脚本中执行此命令,并使用以下代码将输出捕获到数组中:

commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

产生以下输出:

+ 95b117c39869a810595f1e169c64e728d2d7443d + e126f1b996ecf1d2a8cf744c74daa92cce338123 + 869169a6cb0bbe8f1922838798580a1e74ec3884 + 667819b617c88bd886dc2001f612b5c7a4d396c3 + fd41328a84b0a127affa6fe432
8c93e933de378c + cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这不是一件好事

我的提交列表以字符串形式返回,我必须先将其分解,然后才能使用它。经过一番搜索,我发现如果我在捕获数据之前将IFS=""添加到我的脚本中,我的问题就会得到解决。

所以我编辑了我的代码来阅读

IFS=""
commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

哪个输出

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

这完全结束了我的现实感。

我想知道为什么事情正在做他们正在做的事情,所以经过更多搜索后,我发现这被称为Internal Field Separator,它在 Unix 系统上被命令解释器用来确定在哪里分解模式进入令牌。

这个我明白了。

我不明白的是

  1. 为什么将此变量设置为空字符串可以让它以理智的方式处理我的数组数据。
  2. 为什么我必须首先设置它,而不是解释器意识到它正在处理数组数据并适当地处理它。
  3. 将内部字段分隔符设置为空字符串会产生什么影响,因为默认情况下它包含空格、制表符和换行符的字符。

如果能帮助我理解这三点,我们将不胜感激。

【问题讨论】:

    标签: shell unix ifs


    【解决方案1】:

    man bash/Arrays。你的阵列一切都很好。当你这样做时

    echo ${commit_hashes[@]}
    

    echo 在一行上显示所有数组元素,就像它被告知的那样。当你说

    for i in `seq 10`; do
        echo ${commit_hashes[$i]}
    done
    

    您会看到每行只显示一个条目。

    但是,当您将 IFS= 设置为空字符串时,git cherry 的结果不会分解为多个值。包括换行符的整个字符串被分配给第一个数组元素。如果你

    echo ${commit_hashes[0]}
    

    在第二种情况下,您会看到,回显显示所有输出行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2022-01-13
      • 2017-06-18
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多