Bash 设置包含'&燃气轮机';在狂欢节上

Bash 设置包含'&燃气轮机';在狂欢节上,bash,variables,Bash,Variables,我必须使用bash脚本(我不熟悉bash)来提交HPC作业。作业提交脚本模板设置命令和选项,然后最终将它们组合在一起: input="file_name" name="simulation1" application=my_app options="in=$input.h5 out=$name.h5 param1=foo" cmd="$application $options" 这一切正常,即执行eval$cmd my_app in=$input.h5 out=$name.h5 param

我必须使用bash脚本(我不熟悉bash)来提交HPC作业。作业提交脚本模板设置命令和选项,然后最终将它们组合在一起:

input="file_name"
name="simulation1"

application=my_app
options="in=$input.h5 out=$name.h5 param1=foo"

cmd="$application $options"
这一切正常,即执行
eval$cmd

my_app in=$input.h5 out=$name.h5 param1=foo
my_app in=$input.h5 out=$name.h5 param1=foo absrad=mass
my_app in=$input.h5 out=$name.h5 param1=foo absrad="mass>1?H:0"
直到我需要选项中的字符“>”。特别是,我想添加选项
absrad=“mass>1?H:0”
,但如果我只是设置

options="in=$input.h5 out=$name.h5 param1=foo absrad=mass>1?H:0"
然后bash在'>'处截断它,以便执行
eval$cmd

my_app in=$input.h5 out=$name.h5 param1=foo
my_app in=$input.h5 out=$name.h5 param1=foo absrad=mass
my_app in=$input.h5 out=$name.h5 param1=foo absrad="mass>1?H:0"
相反。如何修复该问题,使
eval$cmd
执行

my_app in=$input.h5 out=$name.h5 param1=foo
my_app in=$input.h5 out=$name.h5 param1=foo absrad=mass
my_app in=$input.h5 out=$name.h5 param1=foo absrad="mass>1?H:0"

编辑。请注意,这类似于,但不是重复的,其中一个引用的参数是问题所在。此外,这里的答案只考虑使用数组的选项的解决方案。我想要不带阵列的备选方案。

您可以始终使用阵列作为选项:

declare -a options=("in=$input.h5" "out=$name.h5" "param1=foo" "absrad=\"mass>1?H:0\"");
declare -a cmd=(my_app "${options[@]}");
然后,当您要展开
cmd
时,以下内容应为您提供正确的展开:

"${cmd[@]}"

此外,这样就不需要使用
eval
,我倾向于尽可能避免使用它。

bash不是有一个标准的转义字符吗?例如“\>”或单引号也可能在名为like
$cmd
“$cmd”
的命令中起作用,因为后者应该起作用。仅供参考-
eval
本身不是截断,但是扫描字符串并执行变量替换,当它到达
'>'
时,它会看到重定向字符,并将创建一个名为
'1?H:0'
的文件。然后它将该行传递给shell执行。避免使用eval的另一个原因是,如果它所操作的变量可以被操纵,那么使用eval可能是危险的。结束这个问题,你就失去了(数组之外)其他答案的机会。