【问题标题】:Passing arguments to /bin/bash via a bash script通过 bash 脚本将参数传递给 /bin/bash
【发布时间】:2012-08-21 16:49:36
【问题描述】:

我正在编写一个 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

【问题讨论】:

    标签: bash


    【解决方案1】:

    引用-c的bash手册:

    如果存在 -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 位?

    【讨论】:

      【解决方案2】:

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

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

      -c '...' 后面的第一个参数被当作$0,所以我只是放了 some_program 那里。

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

      【讨论】:

      • 我错过了 $0 部分,谢谢!非常感谢。现在,如果 some_program 的路径也存储在变量(比如 $cmd)中,那么如何格式化呢?此外,您对登录 shell 部分的看法是正确的……这实际上不是必需的。
      • @JCOidl bash -c '"$@"' _ "$cmd" "$@" 虽然如果您不需要登录 shell,那么您也不需要调用新的 bash 实例,只需在当前脚本中运行它即可。 "$cmd" "$@"
      • 我看不懂这里的下划线符号。我不简单地使用"$cmd" "$@" 的原因是这个脚本是从需要访问用户环境的 OSX 程序中调用的。所以在某些情况下,我将不得不调用 /bin/tcsh、/bin/ksh 等。
      • @JCOidl 我只是使用 _ 而不是 some_command 来缩短它。无论如何都没有使用 $0。但是,用户的环境应该在用户登录时加载,然后由所有进程继承,所以我不明白你的意思。
      • 是的……令人困惑。 OSX 将 GUI 应用程序可用的环境变量与从终端启动的 UNIX 类型程序可用的环境变量分开。因此登录到 GUI 不会自动加载在 .profile 或 .cshrc 中设置的环境或与用户默认 shell 对应的任何内容。无论如何,即使将程序名称(或$cmd)替换为下划线也会导致command not found 错误。 PS - 感谢您的来回。它非常有用。
      猜你喜欢
      • 2019-02-08
      • 2014-10-04
      • 2022-01-27
      • 2015-07-12
      • 2021-11-18
      • 2012-12-29
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多