我想知道使用命令时使用位置参数的最佳方法bash -c
.
手册页指示-c
选项:
如果在command_string之后有参数,则将它们分配给位置参数,从$ 0开始.
所以我想以下表格是正确的:
$ bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
但是我看到了以下形式,我想知道为什么会更好
$ bash -c 'printf "%s %s %s\n" $1 $2' _ param1 param2
param1 param2
Run Code Online (Sandbox Code Playgroud)
在这种情况下,角色会_
替换$0
.
我知道,对于许多解释器来说$0
有一个特殊的含义(命令名称,所有位置参数......),但在这种情况下,手册页非常清楚.
那么,第一种形式是否有问题,并且使用$0
作为bash -c
命令的第一个位置参数有什么缺点吗?
Joh*_*024 19
bash -c 'printf "%s %s %s\n" $0 $1 $2' param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
上述工作,但很多人会认为这是一个坏习惯.如果要将-c
字符串中的代码复制到脚本中,则会失败.同样,如果您要将代码从脚本复制到-c
字符串,则会失败.
相比之下,使用以下形式,$1
在-c
字符串中表示与脚本或shell函数中的含义相同:
bash -c 'printf "%s %s %s\n" $1 $2 $3' _ param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
编程风格的一致性减少了错误.
$0
不同一个习惯上用$@
or或者引用所有脚本的参数$*
.请注意,这些变量不包括$0
:
$ bash -c 'echo "$*"' param1 param2 param3
param2 param3
$ bash -c 'echo "$@"' param1 param2 param3
param2 param3
Run Code Online (Sandbox Code Playgroud)
$0
是程序名称在常规脚本中,$0
是脚本的名称.因此,在使用时bash -c
,有些人更喜欢为$0
参数使用一些有意义的名称,例如:
bash -c 'printf "%s %s %s\n" $1 $2 $3' bash param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
要么:
bash -c 'printf "%s %s %s\n" $1 $2 $3' printer param1 param2 param3
Run Code Online (Sandbox Code Playgroud)
如果-c
字符串生成错误,则此方法具有明显的优势.例如,考虑以下脚本:
$ cat script.sh
#!/bin/bash
bash -c 'grepp misspelling "$1"' BadPgm file.txt
Run Code Online (Sandbox Code Playgroud)
如果我们运行脚本,则会生成以下输出:
$ ./script.sh
BadPgm: grepp: command not found
Run Code Online (Sandbox Code Playgroud)
这将错误的来源标识为bash -c
字符串中的命令.
小智 8
该参数$0
是特殊的,因为它不参与shift
(例如).
这按预期工作:
$ bash -c 'shift; printf "%s %s %s\n" $1 $2 $3' _ par1 par2 par3 par4
par2 par3 par4
Run Code Online (Sandbox Code Playgroud)
这不是:
$ bash -c 'shift; printf "%s %s %s\n" $0 $1 $2' par1 par2 par3 par4
par1 par3 par4
Run Code Online (Sandbox Code Playgroud)
sh -c command_string [command_name [argument ...]]
应支持以下附加选项:
-C
从command_string操作数读取命令.从其余参数操作数依次设置command_name操作数的值和特殊参数0的值(参见特殊参数)和位置参数($ 1,$ 2等).
所以,使用这个:
sh -c 'commands' command_name arg1 arg2 arg3 ....
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1640 次 |
最近记录: |