所以, 人们常常问我为什么不是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告诉你的编辑我决定什么是代码,而不是它。
答案 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
,被视为普通字符串(而不是数组)。不是你想要的。