【发布时间】:2015-05-06 20:09:06
【问题描述】:
我正在编写一个接受一些可选参数的 bash 脚本。我想翻译它们并将它们传递给另一个脚本。但是,我很难优雅地传递可选参数。
这是我设法用伪代码工作的概要:
a.sh:
if arg1 in arguments; then
firstArg="first argument"
fi
if arg2 in arguments; then
secondArg="second argument"
fi
./b.sh $firstArg $secondArg "default argument"
注意参数中的空格。
b.sh:
for arg in "$@"
do
echo $arg
done
我想调用b.sh,可以选择使用firstArg 和secondArg 以及像这样的默认参数:
./b.sh $firstArg $secondArg "default argument"
这样做的问题是,如果$firstArg 或$secondArg 是带有空格的字符串,它们将被表示为多个参数,并且输出将类似于:
first
argument
second
argument
default argument
好的,这很容易解决,让我们通过在其周围添加引号来捕获整个参数字符串:
./b.sh "$firstArg" "$secondArg" "defaultArg"
问题是,例如,firstArg 未设置,它会导致空行(因为它将"" 解释为参数),因此输出将类似于:
(blank line here)
second argument
defaultArg
我也尝试过构造一个字符串并将其传递给 shell 脚本,但它似乎也不是这样工作的(它将整个字符串解释为一个参数,即使我用引号将参数分开) .
请注意,使用引用的参数从我的命令行调用 b.sh 可以正常工作。有没有办法在 bash 脚本中模仿它的工作原理?
【问题讨论】:
-
旁白:仅仅因为我正在复制您的线索并在可执行文件上使用
.sh扩展名(即,具有 +x 权限的文件,execv()-family 调用将成功)不会'不是说这是个好主意。一般来说,UNIX 中的命令不应该有任何扩展名,无论它们是通过 shell 脚本、Python 脚本、编译的二进制文件等提供的。 -
您能否明确说明这是否适用于使用
#!/bin/sh或#!/bin/bash的代码?