将bash脚本args作为命名参数传递给脚本内的命令

时间:2018-02-13 00:01:30

标签: python bash variables

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

110

键是由我的脚本设置的,我知道那部分是好的。

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

我会把我的脚本称为

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

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

my_script /tmp filename

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

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

2 个答案:

答案 0 :(得分:3)

删除here-document分隔符周围的引号(即使用<< ENDSSH而不是<< 'ENDSSH')。引号告诉shell不要在here-document中扩展变量引用(以及其他一些东西),因此$1$2会传递给远程shell ...这不会有任何参数,所以它什么都不用。

顺便说一下,删除单引号可能不完全有效,因为如果任一参数包含空格或shell元字符,则远程端将以您可能不想要的方式解析那些。只要两个参数都不能包含单引号,您就可以使用:

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

如果可能包含单引号,则会更加复杂。

答案 1 :(得分:1)

更偏执的做法是:

# 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匹配(如果本地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"