在Bash脚本中,如何使用变量设置多个命令选项?
我想将任意命令的选项存储为bash中的字符串,以便执行以下操作:在Bash脚本中,如何使用变量设置多个命令选项?,bash,shell,string-interpolation,Bash,Shell,String Interpolation,我想将任意命令的选项存储为bash中的字符串,以便执行以下操作: presets_A='-A' presets_B='-A -l -F' ls $presets_A ls $presets_B 第一个有效,socond给出了ls:invalid选项--' 当我尝试将整个命令存储在字符串变量(与函数相反)中时,也会发生同样的情况 或者别名,这不是我想要的): 这将给出ls-A:command not found。不好的。显然,我还没有找到正确的答案 Bash著名的(@]}“$%”引号和括号的混合
presets_A='-A'
presets_B='-A -l -F'
ls $presets_A
ls $presets_B
第一个有效,socond给出了ls:invalid选项--'
当我尝试将整个命令存储在字符串变量(与函数相反)中时,也会发生同样的情况
或者别名,这不是我想要的):
这将给出ls-A:command not found
。不好的。显然,我还没有找到正确的答案
Bash著名的(@]}“$%”引号和括号的混合体。${!预设值A}
也不起作用
但我很可能被搞糊涂了
EDIT为了澄清,我知道如何使用函数来封装设置选项,并将一组参数化调用包含在一个命令下。我要寻找的是(Bash)foo“$@”
或(Python)foo(*p,**Q)
或JSfoo(…p)的等价物
这样我就可以得到一个可序列化和可传输的值,该值在一个地方包含调用的参数。如果函数真的不满足您的要求,那么您可以使用数组来分隔参数:
presets_A=( -A )
presets_B=( "${presets_A[@]}" -l -F ) # or just -A -l -F
ls "${presets_A[@]}" # ls -A
ls "${presets_B[@]}" # ls -A -l -F
使用“${array[@]}”
将数组展开为参数列表,由字段分隔符(默认为空格)分隔
<>但是我会考虑定义两个函数
la () {
ls -A
}
lalf () {
ls -A -l -F
}
此后,我找到了问题的根源;我曾尝试在具有以下标题的脚本中为选项使用一个变量:
#!/usr/bin/env bash
set -euo pipefail; IFS=$'\n\t'
presets_A='-A'
presets_B='-A -l -F'
ls $presets_A
ls $presets_B
当我移除内部字段分隔符设置时,它确实按预期工作,因此我认为我的问题的正确答案是:
“在Bash中,在一个变量中存储多个命令参数是可以的,只要未将IFS
重置为空格以外的值,就可以使用。”
我可以肯定这一点
#!/usr/bin/env bash
set -euo pipefail; IFS=$' '
presets_A='-A'
presets_B='-A -l -F'
command_C='ls -A -l -F'
ls $presets_A
echo '----------------------------------'
ls $presets_B
echo '----------------------------------'
$command_C
正如预期的那样工作;感谢@TomFenech指出了这一点(注意顶部附近的显式IFS='
)
FWIW我重新设置IFS的原因是:有;他们称之为“Bash strict mode”。结果表明,它使您的脚本以微妙的方式不兼容。强制链接-并且它不是您正在寻找的那些符号的任意组合。我无法在发布的代码中复制它。您确定没有引用e变量?你是否修改了IFS
?@TomFenech我知道,但偶尔也会有这样的感觉,正如@otherguy所说,“预设值_B=”-A-l-F'
后跟ls$presets_B
”-你能扩展你的问题吗?我们可以重现你的问题吗?你为什么不直接使用这样的别名e> alias lB=“ls-A-l-F”
对我的脚本来说就像一个魔咒,可以预加载常见的数据库选项,谢谢!
#!/usr/bin/env bash
set -euo pipefail; IFS=$' '
presets_A='-A'
presets_B='-A -l -F'
command_C='ls -A -l -F'
ls $presets_A
echo '----------------------------------'
ls $presets_B
echo '----------------------------------'
$command_C