Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash脚本中,如何使用变量设置多个命令选项?_Bash_Shell_String Interpolation - Fatal编程技术网

在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著名的(@]}“$%”引号和括号的混合

我想将任意命令的选项存储为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)
或JS
foo(…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