6

我正在编写一个 bash 脚本,它接受许多命令行参数(可能包括空格)并通过登录 shell 将所有这些参数传递给程序(/bin/some_program)。从 bash 脚本调用的登录 shell 将取决于用户的登录 shell。假设用户在本例中使用 /bin/bash 作为他们的登录 shell……但它可能是 /bin/tcsh 或其他任何东西。

如果我知道有多少参数将传递给 some_program,我可以在我的 bash 脚本中加入以下几行:

#!/bin/bash
# ... (some lines where we determine that the user's login shell is bash) ...
/bin/bash --login -c "/bin/some_program \"$1\" \"$2\""

然后调用上面的脚本如下:

my_script "this is too" cool

通过上面的例子,我可以确认 some_program 接收到两个参数,“this is too”和“cool”。

我的问题是......如果我不知道将传递多少个参数怎么办?我想将发送给 my_script 的所有参数传递给 some_program。问题是我无法弄清楚如何做到这一点。以下是一些不起作用的事情:

/bin/bash --login -c "/bin/some_program $@"     # --> 3 arguments: "this","is","too"
/bin/bash --login -c /bin/some_program "$@"     # --> passes no arguments
4

2 回答 2

7

引用 bash 手册-c

如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始

为我工作:

$ cat x.sh
#!/bin/bash
/bin/bash --login -c 'echo 1:$1 2:$2 3:$3' echo "$@"
$ ./x.sh "foo bar" "baz" "argh blargh quargh"
1:foo bar 2:baz 3:argh blargh quargh

我不知道您是如何得出“没有争论”的结论的,也许您错过了$0一点?

于 2012-08-21T16:59:43.923 回答
2

避免将变量嵌入到其他脚本中,而是将它们作为参数传递。在这种情况下:

bash --login -c 'some_program "$@"' some_program "$@"

-c '...' 之后的第一个参数被视为 $0,所以我只是在那里放了 some_program。

附带说明一下,需要登录 shell 是一个奇怪的要求。用户没有登录吗?

于 2012-08-21T17:00:08.213 回答