【发布时间】:2018-01-23 04:16:20
【问题描述】:
在《Linux Shell Scripting Cookbook》一书中
它说$@ 扩展为$1、$2、$3 等等,$* 扩展为$1c$2c$3,其中c 是IFS 的第一个字符。
$@ 和 $* 有什么区别,IFS 是什么意思?
【问题讨论】:
-
为什么这个问题被否决了?
在《Linux Shell Scripting Cookbook》一书中
它说$@ 扩展为$1、$2、$3 等等,$* 扩展为$1c$2c$3,其中c 是IFS 的第一个字符。
$@ 和 $* 有什么区别,IFS 是什么意思?
【问题讨论】:
IFS 是内部字段分隔符,它基本上表示shell 识别为分隔单词的内容。
所以要运行以下命令
IFS=$'\n'
会导致 shell 将新行识别为分隔符。
$ 是某物被赋值给变量的标志
但是这些数字是为脚本输入保留的。
所以 $1 将是一个变量输入,$2 将是第二个变量输入。
$@ 是传递给脚本的所有参数。
所以如果你运行命令
bash command.sh bork woof meow
这将是上面列出的变量的值
$1 = bork
$2 = woof
$3 = meow
$@ = bork woof meow
【讨论】:
手册中的解释很难改进。例如,dash(1) 说:
$@从一开始扩展到位置参数。当扩展发生在双引号内时,每个位置参数都扩展为一个单独的参数。如果没有定位 参数,
@的扩展生成零参数,即使@被双引号引起来。这基本上意味着,例如,如果$1是“abc”并且$2是“def ghi”,那么"$@"扩展为 两个参数:"abc""def ghi"
我们可以通过一些例子来展示$*和$@之间的区别:
$ set 1 "2 3"
$ printf '"%s"\n' "$@"
"1"
"2 3"
$ printf '"%s"\n' $@
"1"
"2"
"3"
$ printf '"%s"\n' "$*"
"1 2 3"
$ printf '"%s"\n' $*
"1"
"2"
"3"
手册页还描述了IFS:
IFS输入字段分隔符。这通常设置为⟨space⟩、⟨tab⟩和⟨newline⟩。有关详细信息,请参阅空白分割部分。
【讨论】: