Git Bash 和新行
Git Bash and new line
所以,
人们经常问为什么我不是 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 状态的陶瓷结果,在新行上拆分它,然后在每一行的 space 上拆分它。
这将创建一个数组数组,看起来像:
[0] "M","modfile.cs"
[1] "A","addfile.cs"
[2] "??","newfile.cs"
但 IFS 似乎永远不想处理马车 return。在其他命令中,我能够解决此问题,因为它们具有 -printf 或 --pretty 参数,我可以更改其上的拆分字符。但是我只获得换行状态,到目前为止,bash 脚本无法在新行上拆分。
有什么想法吗?
谢谢
Jaeden "Sifo Dyas" al'Raec Ruiner
PS 告诉你的编辑,我决定什么是代码,而不是它。
我认为您对 bash 语法感到困惑(诚然,这有点混乱)。问题是 var=(some stuff)
和 var=$(some stuff)
做完全不同的事情。 var=(some stuff)
将 var
设置为数组。 var=$(some stuff)
将 some stuff
作为命令运行,捕获其输出,并将其作为纯字符串存储在 var
中,而不是数组 (并且不拆分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
,被视为普通字符串(而不是数组)。根本不是你想要的。
所以, 人们经常问为什么我不是 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 状态的陶瓷结果,在新行上拆分它,然后在每一行的 space 上拆分它。 这将创建一个数组数组,看起来像:
[0] "M","modfile.cs"
[1] "A","addfile.cs"
[2] "??","newfile.cs"
但 IFS 似乎永远不想处理马车 return。在其他命令中,我能够解决此问题,因为它们具有 -printf 或 --pretty 参数,我可以更改其上的拆分字符。但是我只获得换行状态,到目前为止,bash 脚本无法在新行上拆分。
有什么想法吗? 谢谢 Jaeden "Sifo Dyas" al'Raec Ruiner
PS 告诉你的编辑,我决定什么是代码,而不是它。
我认为您对 bash 语法感到困惑(诚然,这有点混乱)。问题是 var=(some stuff)
和 var=$(some stuff)
做完全不同的事情。 var=(some stuff)
将 var
设置为数组。 var=$(some stuff)
将 some stuff
作为命令运行,捕获其输出,并将其作为纯字符串存储在 var
中,而不是数组 (并且不拆分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
,被视为普通字符串(而不是数组)。根本不是你想要的。