【发布时间】:2018-09-23 17:01:25
【问题描述】:
所以我是新学习 bash 脚本,我想出了以下代码。
run_command() {
echo "+" "$@"
"$@"
}
我对“$@”的含义感到困惑,为什么它是两次?
非常感谢您抽出宝贵的时间,祝您有美好的一天。
【问题讨论】:
所以我是新学习 bash 脚本,我想出了以下代码。
run_command() {
echo "+" "$@"
"$@"
}
我对“$@”的含义感到困惑,为什么它是两次?
非常感谢您抽出宝贵的时间,祝您有美好的一天。
【问题讨论】:
Aagam Jain 得到了答案。我将添加一些不适合评论部分的解释。对于冗长的内容,我深表歉意。
考虑这个例子。
显示给脚本的参数
test.sh:
echo "$1"
echo "$2"
让我们运行这个脚本并给它两个参数。
$> bash test.sh ls -l
结果:
ls
-l
第一个参数ls,由$1 表示,在第一行回显。第二个参数-l,由$2表示,在第二行回显。
Bash 手册 - 让我们看看它是怎么说的
($@) 展开为位置参数,从一开始
看到这个:https://www.gnu.org/software/bash/manual/bash.html#Special-Parameters
这对我们的示例有何影响?让我们稍微改变一下 test.sh。
从一开始展开参数
test.sh:
echo "$@"
让我们运行它。
$> bash test.sh ls -l
结果:
ls -l
$@ 在同一行中一个接一个地列出了两个参数。如果你有 5 个参数,它们会一个接一个地打印出来。
让我们再修改一下 test.sh。
在回显中添加+
test.sh:
echo "+" "$@"
让我们运行它。
$> bash test.sh ls -l
结果:
+ ls -l
这意味着在打印两个参数之前出现了+。
多修改一下 test.sh。
执行所有提供的参数
test.sh:
echo "+" "@"
"$@"
让我们运行它。
bash test.sh ls -l
结果:
+ ls -l
total 4
-rw-r--r-- 1 eapo users 0 Sep 23 19:38 file1
-rw-r--r-- 1 eapo users 19 Sep 23 19:38 test.sh
太好了。正如评论者和 Aagam 所提到的,脚本打印出它要执行的内容(使用echo "+" "$@"),然后执行命令。 "$@" 基本上只是在做ls -lh。终端只是按原样执行它。
现在让我们在脚本中添加一个函数。
在脚本中添加函数
test.sh:
run_command() {
echo "+" "$@"
"$@"
}
run_command ls -l
请注意,我们是在脚本本身中执行函数,而不是在命令行中给出它
让我们运行它。
bash test.sh
结果:
+ ls -l
total 4
-rw-r--r-- 1 eapo users 0 Sep 23 19:38 file1
-rw-r--r-- 1 eapo users 58 Sep 23 19:41 test.sh
希望这些示例带您了解脚本的功能。
【讨论】:
这会打印命令及其输出。
例如
run_command() {
echo "+" "$@"
"$@"
}
run_command ls
#output
#+ ls
#files_list_in_current_directory
【讨论】:
$@ 保存传递给您的函数的参数。
$@ 只是论据。 echo "+" "$@" 运行echo 命令以打印一个“+”,后跟参数,然后"$@" 本身将参数本身作为命令运行(只是让输出转到通常的位置)。因此,如果您运行run_command cp file1 file2,它将执行echo + cp file1 file2,然后执行cp file1 file2。