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['*]}”