通过命令行将环境变量中带引号的字符串传递给程序

时间:2018-07-13 17:48:49

标签: bash shell

我有一个将带引号的字符串放在环境变量中的系统。该环境变量作为命令行参数传递给python程序,但是带引号的字符串被拆分为多个单词,而不是在一起。

例如:

在外壳中:

$ export ARG_OPTIONS='--flag -a 31 --big_complicated_flag "How are you?"'

在bash脚本中:

python args.py $ARG_OPTIONS

在python脚本中:

import sys
print sys.argv

结果是:

['args.py', '--flag', '-a', '31', '--big_complicated_flag', '"How', 'are', 'you?"']

这里重要的是引号中的字符串已被分割成多个部分,这不是程序期望参数的方式。 我不能对此设置进行太多更改,所以任何想法都将不胜感激。


我尝试过的事情

Shell中的双引号

python args.py "$ARG_OPTIONS"
Result: ['args.py', '--flag -a 31 --big_complicated_flag "How are you?"']

这是不正确的,因为整个变量都作为单个参数传递。 但是,我期望这种行为,但我想尝试一下。

Shell中的单引号

python args.py "$ARG_OPTIONS"
Result: ['args.py', '$ARG_OPTIONS']

也不正确,但是从我对单引号的理解中可以预期。

环境变量周围的双引号

export ARG_OPTIONS="--flag -a 31 --big_complicated_flag \"How are you?\""
Result: ['args.py', '--flag', '-a', '31', '--big_complicated_flag', '"How', 'are', 'you?"']

此结果与原始结果相同。

围绕环境变量的双引号

export ARG_OPTIONS='"--flag -a 31 --big_complicated_flag \"How are you?\""'
Result: ['args.py', '"--flag', '-a', '31', '--big_complicated_flag', '\\"How', 'are', 'you?\\""']

也不正确。

使用IFS进行处理

更改IFS分隔符并手动分隔环境变量中的参数:

export ARG_OPTIONS='--flag|-a|31|--big_complicated_flag|How are you?'

在shell脚本中:

IFS='|'
python args.py $ARG_OPTIONS

Result: ['args.py', '--flag', '-a', '31', '--big_complicated_flag', 'How are you?']

这会产生预期的输出,但似乎有点黑,以后容易混淆。显然,关于外壳程序和环境变量之间的交互,我有些不了解。

为什么分隔双引号中的单词?有没有更清洁的方式来实现我的目标?

1 个答案:

答案 0 :(得分:-1)

代替

python args.py $ARG_OPTIONS

您可能想使用

eval "python args.py $ARG_OPTIONS"

来自eval的bash帮助:

eval: eval [arg ...]
Execute arguments as a shell command.

Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.

简而言之,eval再次重新评估了其参数;这样会将一对双引号的文字转换为双引号,从而影响单词拆分。

但是,请注意:此方法存在安全风险-现在可以执行任意代码。