我想知道在使用命令 bash -c
时使用位置参数的最佳方式。
手册页为 -c
选项指出:
If there are arguments after the command_string, they are assigned to the positional parameters, starting with $0.
所以我猜下面的形式是正确的:
$ bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
param1 param2 param3
但是I saw the following form , 我想知道为什么它会更好
$ bash -c 'printf "%s %s %s\n" $1 $2' _ param1 param2
param1 param2
在这种情况下,字符 _
替换 $0
。
我知道对于许多解释器来说 $0
有特殊的含义(命令名称,所有位置参数......),但在这种情况下,手册页非常清楚。
那么,第一种形式有什么问题吗?使用 $0
作为 bash -c
命令的第一个位置参数有什么缺点吗?
最佳答案
bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
上述方法有效,但许多人认为养成这种习惯是个坏习惯。如果您要将代码从 -c
字符串复制到脚本,它将失败。同样,如果您要将代码从脚本复制到 -c
字符串,它将失败。
相比之下,对于以下形式,$1
在 -c
字符串中的含义与在脚本或 shell 函数中的含义相同:
bash -c 'printf "%s %s %s\n" $1 $2 $3' _ param1 param2 param3
编程风格的一致性减少了错误。
shell 以不同的方式对待 $0
人们习惯用$@
或$*
来引用脚本的所有参数。请注意,这些变量不包括$0
:
$ bash -c 'echo "$*"' param1 param2 param3
param2 param3
$ bash -c 'echo "$@"' param1 param2 param3
param2 param3
$0
为程序名
在常规脚本中,$0
是脚本的名称。因此,在使用 bash -c
时,有些人更喜欢为 $0
参数使用一些有意义的名称,例如:
bash -c 'printf "%s %s %s\n" $1 $2 $3' bash param1 param2 param3
或者:
bash -c 'printf "%s %s %s\n" $1 $2 $3' printer param1 param2 param3
如果 -c
字符串产生错误,这种方法有明显的优势。例如,考虑这个脚本:
$ cat script.sh
#!/bin/bash
bash -c 'grepp misspelling "$1"' BadPgm file.txt
如果我们运行脚本,会产生以下输出:
$ ./script.sh
BadPgm: grepp: command not found
这将错误源标识为 bash -c
字符串中的命令。
关于bash - 如何在 "bash -c"命令中使用位置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38866883/