Git Bash和新线

时间:2016-11-03 15:42:59

标签: git bash ifs

所以, 人们常常问我为什么不是linux的粉丝,这就是为什么。 在Windows编程中,\ n是\ n。期。没有其他解释。但是在linux bash中,谁知道你会得到什么。

例如: 我在网上看到的每件事都说: IFS = $' \ n'

将拆分新线。 所以有人请向我解释原因:

local OIFS="$IFS"
IFS=$'\n'
local status=$(git status --porcelain 2> /dev/null)
#I even added this just in case:
status=$( status )
#but no matter what length is always 1
local length=${#status[@]}
echo $length
IFS=$OIFS

当我确定此存储库中的git状态返回7行数据时,回显值为1? 我已经尝试了,$(echo -en" \ n \ b"),我已经尝试过" \ n" (这似乎很有趣,可以在新行上分割,但也可以在字母n上分割。) 它就像linux中没有标准化一样。我可以多次运行相同的脚本并获得不同的结果。

我想要的只是一个脚本,它获取git status的瓷器结果,将它分成新行,然后将它分成每行的空间。 这将创建一个数组数组,如下所示:

[0] "M","modfile.cs"
[1] "A","addfile.cs"
[2] "??","newfile.cs"

但IFS似乎并不想要处理回车。在其他命令中,我能够解决这个问题,因为他们有-printf或--pretty参数,我可以更改分裂字符。但是获取状态我只是新行,到目前为止,bash脚本不能拆分新行。

有什么想法吗? 谢谢 Jaeden" Sifo Dyas" al' Raec Ruiner

PS告诉你的编辑我决定什么是代码,而不是它。

1 个答案:

答案 0 :(得分:1)

我认为你对bash语法感到困惑(诚然,这有点乱)。问题是var=(some stuff)var=$(some stuff)做了完全不同的事情。 var=(some stuff)var设置为数组。 var=$(some stuff)作为命令运行some stuff,捕获其输出,并将其作为普通字符串存储在var 中,而不是数组(并且不与{{ 1}})。如果要从命令输出创建数组,则需要将两者结合使用:IFS。所以这应该有效:

arrayvar=( $(some stuff) )

请注意,我在序列的前面移动了local OIFS="$IFS" IFS=$'\n' local status=( $(git status --porcelain 2> /dev/null) ) IFS=$OIFS #but no matter what length is always 1 local length=${#status[@]} echo $length 命令,因为您希望它控制的拆分发生在IFS=$OIFS行,并且非标准status=( stuff to be split )设置的时间超过IFS必要的可能导致奇怪的影响。此外,我完全删除了status=$( status ),因为它丢弃了变量(/ array)status的先前值,并将其替换为命令的输出( not 变量) status,被视为普通字符串(而不是数组)。不是你想要的。