我有一个复杂的命令,我想制作一个shell/bash脚本.我可以$1轻松地写出来:
foo $1 args -o $1.ext
Run Code Online (Sandbox Code Playgroud)
我希望能够将多个输入名称传递给脚本.什么是正确的方法呢?
当然,我想处理其中包含空格的文件名.
在我看来,它们都存储了所有命令行参数.
两者之间有区别吗?
可能重复:
bash中"$ @"和"$*"之间的区别是什么?
多年来,我曾多次在shell脚本的使用$*和犹豫之间犹豫不决$@.已经读了bash的手册页的适用部分,一遍又一遍,已经尝试都$*和$@我或多或少完全无法理解两个变量之间的应用程序的实际差别.你能告诉我吗?
我$*最近一直在使用,但不要问我为什么.我不知道为什么,因为我不知道为什么$@甚至存在,除了作为一个几乎完全的同义词$*.
有什么实际区别吗?
(我个人倾向于使用Bash,但对shell的选择保持不可知.就我所知,我的问题并不是Bash特有的.)
我是bash的新手,我正在学习它,而且我怀疑使用$@和之间的真正区别S*.
我在这里红色Bash特殊参数
我知道两者都扩展到位置参数,但差异发生在双引号内.顺便说一句"$@" = "$1" "$2"..."$n"可能不同于"S*" = "$1$2...$n".
我尝试用一个简单的脚本来理解它:
if [ $# -gt 0 ]; then
echo "Your command line contains $# arguments"
else
echo "Your command line contains no arguments"
exit fi
echo "Params are: "
echo $@
echo $*
echo "$@"
echo "$*"
Run Code Online (Sandbox Code Playgroud)
如果我像这样在终端中执行我的脚本 ~./my_script par1 par2 par3
结果总是一样的:
Params are:
par1 par2 par3
par1 par2 par3
par1 par2 par3
par1 par2 par3
Run Code Online (Sandbox Code Playgroud)
也许我不明白这两个特殊变量的实际用途以及我的例子是否正确.我想用一个很好的例子来弄清楚这一点.
我已经写了一个简单的脚本,需要在任意数量的参数来证明之间的区别$@和$*:
#!/bin/bash
echo "double quoted $* $@"
echo 'single quoted $* $@'
Run Code Online (Sandbox Code Playgroud)
我在CLI上做了
$./stuff.sh a b c d e f dfs
Run Code Online (Sandbox Code Playgroud)
这就是打印出来的东西
double quoted a b c d e f dfs a b c d e f dfs
single quoted $* $@
Run Code Online (Sandbox Code Playgroud)
既然它们是相同的那么意味着$@等于$*?还是有一点我错过了?