bash - 如何在 "bash -c"命令中使用位置参数?

标签 bash

我想知道在使用命令 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/

相关文章:

java - 从 shell 文件创建批处理文件

linux - 更改大括号样式的 Bash 脚本

linux - 参数数量要求输入验证

bash - 为什么 sed 不替换这个换行符?

bash - UNIX 在特定列中搜索用户指定的代码并输出整行

bash - 在 Fail2Ban 配置中使用 bash 脚本

linux - 等待另一个程序启动的进程终止

mysql - FreeBSD、MySQL、Perl、bash : intermittent blocking on named pipes?

node.js - -bash : node: command not found (on EC2 instance)

bash - 子外壳和并行处理