2015-05-06 98 views
5

我正在写一个bash脚本,它接受一些可选参数。我想翻译它们并将它们传递给另一个脚本。但是,我很难适时地传递可选参数。如何将可选参数传递给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 "[email protected]" 
do 
    echo $arg 
done 

我想打电话给b.sh,任选firstArgsecondArg和默认参数,如下所示:

./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脚本,但它不似乎也以这种方式工作(it int将整个字符串作为参数进行错误处理,即使我用引号分隔参数)。

请注意,从命令行调用b.sh引用的参数可以正常工作。有没有办法在bash脚本中模仿这种工作方式?

+1

旁白:就因为我复制你的铅和使用'.sh'扩展在可执行文件上(即具有'execv()' - 家族调用成功的+ x权限的文件)并不意味着这是个好主意。通常,UNIX中的命令不应该有任何扩展名,无论它们是通过shell脚本,Python脚本还是编译的二进制文件提供的。 –

+0

您能否明确说明这是否适用于使用'#!/ * bin/sh'或'#!/ bin/bash'? –

+0

我正在使用bash。 – Andrew

回答

7

如果你硬是要复制给所有的参数,但增加一个:

# this works in any POSIX shell 
./b.sh "[email protected]" defaultArg 

另外,要明确地传递firstArgsecondArg,但只有当它们存在(注意设置到一个空 - 值计为“现有”这里):

# this works in any POSIX shell 
./b.sh ${firstArg+"$firstArg"} ${secondArg+"$secondArg"} defaultArg 

如果你要正确对待集到一个空值不存在:

# this works in any POSIX shell 
./b.sh ${firstArg:+"$firstArg"} ${secondArg:+"$secondArg"} defaultArg 

另一种方法是建立一个数组参数:

# this requires bash or another shell with arrays and append syntax 
# be sure any script using this starts with #!/bin/bash 
b_args=() 
[[ $firstArg ]] && b_args+=("$firstArg") 
[[ $secondArg ]] && b_args+=("$secondArg") 
b_args+=("default argument") 
./b.sh "${b_args[@]}" 

如果要使用相同的灵活性,因为阵列的方法的东西,但如果没有兼容性问题,定义一个函数;在它里面,你可以安全地覆盖"[email protected]"不会影响脚本的其余部分:

runB() { 
    set -- 
    [ -n "$firstArg" ] && set -- "[email protected]" "$firstArg" 
    [ -n "$secondArg" ] && set -- "[email protected]" "$secondArg" 
    ./b.sh "[email protected]" "default argument" 
} 
+0

是不是在引用'“$ @”'这里错了?它不会再是分裂的话题了。不是吗? – hek2mgl

+0

@ hek2mgl,呃?不,在这里显然不需要分词。 –

+0

很好的答案!发布评论时,我没有正确地回答问题。 – hek2mgl

1

使用数组:

args=() 

if [ ... ]; then 
    args+=("first argument") 
fi 

if [ ... ]; then 
    args+=("second argument") 
fi 

./b.sh "${args[@]}" "default argument" 
+0

@EtanReisner不,它不是因为在OP的例子中'$ firstArg'可能根本没有被设置(但是被使用),但是如果它确实被设置了,它将被设置为一个字符串字面值(在上面的代码段中是相同的)。 –

+0

嗯,我认为那些是实际的第一和第二个参数的占位符,而不是字面字符串(在OP和这里),并且由于你没有对实际的参数本身进行测试,所以我没有填写这些参数。没有这个问题,但正如所写,这也只是解决方案的一半(我认为不能很好地解决它)。 –

+0

我得到你从这里来的地方。然而,将'./b.sh“$ firstArg”“$ secondArg”“defaultArg”'作为一种可能的解决方案(并且将其唯一的错误描述为通过空参数而不是完全不提供它们)的OP指示使用字面字符串''第一个参数“'和'”第二个参数“''在问题的早些时候就是不合时宜的。 –

相关问题