Bash 为什么默认$IFS会扩展为一个新行,而;对于$string中的单词;空间上的分裂?
当我通过命令行执行以下代码时:Bash 为什么默认$IFS会扩展为一个新行,而;对于$string中的单词;空间上的分裂?,bash,echo,ifs,Bash,Echo,Ifs,当我通过命令行执行以下代码时: ( mystring="foo:bar baz rab" for word in $mystring; do echo "Word: $word" done ) 我得到的结果是: Word: foo:bar Word: baz Word: rab 这意味着$IFS将被解释为空格字符。 但是,我尝试通过以下操作来扭转它: echo "foo:bar${IFS}baz${IFS}rab" 和打印: foo:bar baz ra
(
mystring="foo:bar baz rab"
for word in $mystring; do
echo "Word: $word"
done
)
我得到的结果是:
Word: foo:bar
Word: baz
Word: rab
这意味着$IFS
将被解释为空格字符。
但是,我尝试通过以下操作来扭转它:
echo "foo:bar${IFS}baz${IFS}rab"
和打印:
foo:bar
baz
rab
这现在意味着$IFS
是\n
。我本以为“foo:bar baz rab”
是什么导致了这种不一致
IFS
默认包含三个字符:空格(第一)、制表符(第二)、换行符(第三)
这意味着这三个字符中的任何一个都可以用作单词分隔符$*
仅使用这三个词中的第一个来分隔单词
如果要从数组中生成由IFS中的第一个字符分隔的字符串,请考虑:
# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"
IFS
默认包含三个字符:空格(第一)、制表符(第二)、换行符(第三)
这意味着这三个字符中的任何一个都可以用作单词分隔符$*
仅使用这三个词中的第一个来分隔单词
如果要从数组中生成由IFS中的第一个字符分隔的字符串,请考虑:
# Combine array elements with the first character in IFS using ${array[*]}
array=( foo:bar baz rab )
echo "${array[*]}"
默认情况下,
IFS
的行为相当于IFS=$'\t\n'
;它包含三个字符。我明白了,那么,单词边界就是这些字符中的任何一个?正确,IFS中的任何字符都将充当单词边界。顺便说一句,如果您要对$mystring中的单词执行,,首先考虑禁用GLUBIN,或者使用<代码> -Read -Re- MyRoad Pube,您的<代码> Engule< /Cord>语句,通过像“代码> HeXDIPP -C/代码>之类的语句,您将看到每个换行符前面有一个空格和一个制表符。它包含三个字符。我明白了,那么,单词边界就是这些字符中的任何一个?正确,IFS中的任何字符都将充当单词边界。顺便说一句,如果您要对$mystring中的单词执行,,首先考虑禁用GLUBIN,或者使用<代码> -Read -Re- MyRoad Pube,您的<代码> Engule< /Cord>语句,通过像<代码> HeXDIP--c>代码>之类的方法,您会看到一个空格和一个标签出现在每个换行符前面。我有点困惑为什么它不是“${Sald[$*] }”,它只反射第一个元素。我在这里找不到模式:(${array[$*]}
正在尝试将通过在项目之间使用空格($*
)展开脚本的参数列表而创建的字符串转换为数字索引。没有任何名称的变量(如果当前上下文中没有参数,它只是一个空字符串),因此它将转换为0
。如果$*
的结果既不是数字,也不是有效的变量名(可以取消引用以尝试查找数字变量或其名称),也不是空字符串,则这将是一个错误。$*
的行为类似于${array[*]
(但在shell的参数列表上操作);“$@”
的行为类似于“${array[@]}”
(但在shell的参数列表上操作)。这有助于找到模式吗?现在很有意义了,谢谢,来自java有点困难。请继续思考[*]是使用仅限字符的关联数组作为索引的(bash等价于Java的Map
)可以有非数字索引,因此可以使用星号或@
作为文字数组索引,但前提是数组是使用declare-a
或等效项创建的——在这种情况下,引用才有区别:在declare-a arr=(['*]='hello'['@]='world')
,从echo“${arr[*]}”
和echo“${arr['*]}”
我有点困惑为什么它不是只回显第一个元素的“${array[$*]}”。我在这里找不到模式:(${array[$*]}
正在尝试将通过在项目($*
)之间使用空格扩展脚本参数列表而创建的字符串转换为数字索引。没有任何名称的变量(如果当前上下文中没有参数,它只是一个空字符串),因此它将转换为0
。如果$*
的结果既不是数字,也不是有效的变量名(可以取消引用以尝试查找数字变量或其名称),也不是空字符串,这将是一个错误。$*
的行为类似于${array[*]}
(但在shell的参数列表上操作);”$@“
的行为类似于“${array[@]}”
(但在shell的参数列表上操作)。这有助于找到模式吗?现在很有意义了,谢谢,来自java有点困难。请继续思考[*]是使用仅包含字符的关联数组作为索引的(bash相当于java的映射
)可以具有非数字索引,因此可以将星号或@
作为文字数组索引,但前提是您的数组是使用declare-a
或等效项创建的——在这种情况下,引号起作用:在declare-a arr=(['*']='hello'[']='world'之后)
,从echo“${arr[*]}”
和echo“${arr['*]}”