【问题标题】:pass bash script args as named parameters to a command inside the script将 bash 脚本 args 作为命名参数传递给脚本内的命令
【发布时间】:2018-07-23 06:36:51
【问题描述】:

我有一个带有两个参数的 bash 脚本。在该脚本中,我需要使用 heredoc 调用 ssh 并调用需要两个参数的方法。例如:

ssh -o "IdentitiesOnly=yes" -t -i $key -l user localhost << 'ENDSSH'
/my_python_app.py -u -t tar -p $1 -f $2
ENDSSH

key 由我的脚本设置,我知道那部分很好。

但是,my_python_app 打印出 args 并且没有显示 -p 和 -f 的任何参数

我会这样称呼我的脚本

my_script /tmp filename

我在我的 python 应用程序中使用 argparse,但我也打印出 sys.argv 它给了我:

['my_python_app.py', '-u', '-t', 'tar', '-p', '-f']

请注意,没有接收到 -p 和 -f 的值。 (-u 是一个标志,并且设置正确)。

如何将 $1 和 $2 作为 -p 和 -f 值传递给 my_python_app?

【问题讨论】:

  • 一般来说,你应该总是引用扩展。 "$key""$1""$2"。没有引号,您无法保证在执行命令时它们将被拆分成多少个单独的 argv 元素。即使您认为所有内容都将始终解析为一个单词,从而改进您的错误消息&c。当遇到意外情况时(得到-p 无法获得'' 的参数比得到-p 得到参数-f-f 没有被解析为一个单独的论点)。

标签: python bash variables


【解决方案1】:

删除此处文档分隔符周围的引号(即使用&lt;&lt; ENDSSH 而不是&lt;&lt; 'ENDSSH')。引号告诉外壳不要在此处文档中扩展变量引用(和其他一些东西),因此 $1$2 被传递到远程外壳......它没有任何参数所以它替换他们一无所有。

顺便说一句,删除单引号可能无法完全起作用,因为如果任一参数包含空格或 shell 元字符,则远程端将以您可能不希望的方式解析它们。只要两个参数都不能包含单引号,您就可以使用:

ssh -o "IdentitiesOnly=yes" -t -i $key -l user localhost << ENDSSH
/my_python_app.py -u -t tar -p '$1' -f '$2'
ENDSSH

如果任何一个可能包含单引号,它就会变得有点复杂。

【讨论】:

  • 谢谢,效果很好。我的 args 没有空格或元字符。
  • @Mark 只要您确定Robert; echo rm * # 不会拜访您...
  • 大声笑,我用我创建和控制的参数调用这个脚本,所以不用担心,但请注意!
  • ${1@Q} 扩展为 shell 引用的值。
  • @jthill 仅在 bash v4.4 中;我们中的一些人使用旧版本:-)
【解决方案2】:

更偏执的方法是:

# store these in an array to reduce the incidental complexity below
ssh_args=( -o "IdentitiesOnly=yes" -t -i "$key" -l user )

posixQuote() {
  python -c 'import sys, pipes; sys.stdout.write(pipes.quote(sys.argv[1])+"\n")' "$@"
}

ssh "${ssh_args[@]}" localhost "bash -s $(posixQuote "$1") $(posixQuote "$2")" << 'ENDSSH'
/path/to/my_python_app.py -u -t tar -p "$1" -f "$2"
ENDSSH

如果您确定目标帐户的 shell 与本地帐户匹配(如果本地 shell 是 bash,则为 bash,如果本地 shell 是 ksh,则为 ksh),请考虑以下替代方法:

printf -v remoteCmd '%q ' /path/to/my_python_app.py -u -t tar -p "$1" -f "$2"
ssh "${ssh_args[@]}" localhost "$remoteCmd"

【讨论】:

    猜你喜欢
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2013-10-22
    • 2016-12-19
    • 1970-01-01
    • 2014-10-25
    相关资源
    最近更新 更多