问题描述
我正在阅读Bash 教程,特别是分词的主题.
I'm going through a Bash tutorial, and specifically the subject of word splitting.
此脚本称为"args",有助于演示分词示例:
This script, called "args", helps demonstrate word splitting examples:
#!/usr/bin/env bash
printf "%d args:" $#
printf " <%s>" "$@"
echo
一个例子:
$ ./args hello world, here is "a string of text!"
5 args: <hello> <world,> <here> <is> <a string of text!>
到目前为止,一切都很好.我知道这是如何工作的.
So far so good. I understand how this works.
但是,当我将IFS替换为非空白字符(例如:
)时,如果我直接将字符串作为参数传递,则脚本不会执行分词.
However, when I replace IFS with a non-whitespace character, say :
, the script does not perform word splitting if I pass the string directly as an argument.
$ ./args one:two:three
1 args: <one:two:three>
但是,如果我(1)将字符串分配给变量,然后(2)通过参数扩展将字符串传递给脚本,则脚本会对同一字符串执行分词./p>
However, the script does perform word splitting on the same string if I (1) assign the string to a variable, and then (2) pass the string to the script via parameter expansion.
$ IFS=:
$ variable="one:two:three"
$ ./args $variable
3 args: <one> <two> <three>
为什么?具体来说,为什么在未设置IFS且定界符为空白字符时将字符串作为参数传递却进行单词拆分,而在将IFS设置为非空白字符时为什么不这样做呢?
Why? Specifically, why does passing the string as an argument undergo word splitting when IFS is unset and the delimiters are whitespace characters, but not when IFS is set to non-whitespace characters?
当我使用read
代替此脚本时,相同的字符串也会按预期进行分词.
When I use read
instead of this script, the same string also undergoes word splitting as expected.
$ IFS=:
$ read a b c
one:two:three
$ echo $a $b $c
one two three
推荐答案
您可以阅读有关分词的更多信息此处.
You can read more about word splitting here.
当您将裸字符串one:two:three
作为IFS设置为:
的参数传递时,Bash不会进行单词拆分,因为裸字符串不是参数扩展,命令替换之一 ,或算术扩展上下文.
When you pass the bare string one:two:three
as an argument with IFS set to :
, Bash doesn't do word splitting because the bare string is not one of parameter expansion, command substitution, or arithmetic expansion contexts.
但是,当将相同的字符串分配给变量并将该变量传递给未引用的脚本时,会发生分词,因为这是参数扩展的情况.
However, when the same string is assigned to a variable and the variable is passed to the script unquoted, word splitting does occur as it is a case of parameter expansion.
同样的东西也适用于这些(命令替换):
The same thing applies to these as well (command substitution):
$ ./args $(echo one:two:three)
3 args: <one> <two> <three>
$ ./args "$(echo one:two:three)"
1 args: <one:two:three>
作为记录,read
命令除非将IFS设置为空字符串,否则在读取的每一行上都会进行分词.
As documented, read
command does do word splitting on every line read, unless IFS has been set to an empty string.
这篇关于在Bash中将IFS设置为非空白字符的单词拆分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!