使用命令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意味着在脚本或shell函数中意味着的-c字符串中的相同内容:
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字符串中的命令。