【发布时间】:2020-11-26 22:42:46
【问题描述】:
我有以下脚本
#!/bin/bash
set -o xtrace
gluster_volume="a.example.com:/data/brick1/gv0 b.example.com:/data/brick1/gv0"
gluster volume create gv0 replica 2 ${gluster_volume} force
在执行第二行时,此脚本抛出与 gluster_volume 相关的错误,即其无法读取完整行,并且仅考虑 a.example.com:/data/brick1/gv0 b.example.com(所以看起来 gluster 命令无法解析它)。
然后我用trace运行这个脚本,发现命令是这样的
gluster volume create gv0 replica 2 'a.example.com:/data/brick1/gv0 b.example.com:/data/brick1/gv0' force
所以脚本正在添加单引号,这会产生问题。我的印象是这是由于set -o xtrace 单引号不是值的一部分,只是显示命令行的一部分。但它不是真的。如果我在命令提示符下运行上面的命令,它会给出相同的错误,并且在删除引号时它会起作用。
如何更改我的脚本使其不添加引号? (我尝试使用 sed 删除引号但不起作用,在运行时发生了一些事情)。
我需要带有动态值的gluster_volume。
更新1:
workers=`echo "${WORKER_HOST_IP}"|sed "s/,$//"`
IFS=','
for worker in ${workers}; do
IFS='-' read -r -a array <<< "$worker"
gluster_volume+=${array[0]}':/data/brick1/gv0 '
done
【问题讨论】:
-
另一个选项可能是使用 eval 命令...首先连接字符串以形成整个命令。 linuxhint.com/bash_eval_command
-
我怀疑您使用的不是
bash,而是zsh。将此添加到您的脚本并将其输出添加到您的问题:echo "$BASH_VERSION"。你如何开始你的脚本? -
@TinkerTenorSoftwareGuy 感谢 eval 对我有用。
-
IFS=','解释了它。您可以在循环后将IFS重置为正常状态(有几种方法可以做到这一点,但都不是完美的),但我会考虑使用更好的方法来拆分workers。最好的方法取决于WORKER_HOST_IP变量的确切格式。