使用以下简化的代码摘录:
DIR='a b'
mount_command="./mount.cpfs $loop $DIR -f $OPTS"
sudo $mount_command
当跟踪打开时执行此行:
+ sudo ./mount.cpfs /dev/loop0 a b -f -o default_permissions,allow_other,attr_timeout=0
但是DIR
没有被引用,所以 a
和b
作为不同的参数传递,而不是相同的 ./mount.cpfs
.
创建这样的命令序列,然后将其扩展到以后的命令行中的最佳方法是什么?
请记住,代码示例已简化为核心问题,我正在使用 mount_command
在几个地方,前后都有各种添加,以及 DIR
由用户传入。我尝试了几种引用 DIR
的组合当分配给 mount_command
时,以及使用数组的原始尝试。
mount_command
的用法示例
mount_command="./mount.cpfs $loop $DIR -f $OPTS"
case "$MODE" in
gdb)
sudo gdb -return-child-result -x gdbbatch \
--args $mount_command
;;
normal)
sudo $mount_command
;;
valgrind)
sudo valgrind --track-fds=yes --leak-check=full --malloc-fill=0x80 \
--free-fill=0xff $mount_command
;;
*)
echo "Mode '$MODE' unknown"
mounted=''
exit 2
;;
esac
更新0
请测试您的建议,我认为解决方案并不简单。
最佳答案
bash 中最好的方法是使用数组。该数组将保持要分隔的单词分开,并在各个单词内保留空格:
DIR='a b'
mount_command=(./mount.cpfs $loop "$DIR" -f $OPTS)
sudo "${mount_command[@]}"
展开"${mount_command[@]}"
时,每个元素都会展开为sudo
的单个参数,即使它有空格。
请注意我如何引用 "$DIR"
而不是 $OPTS
,因为您的 $OPTS
包含多个要传递给mount 命令作为单独的单词,但 $DIR
应保持在一起。但是,您可以按照与 mount_command
相同的方式将 OPTS 设为数组,并将其在 mount_command
定义中扩展为 "${OPTS[@]}"
:
DIR='a b'
OPTS=(-o default_permissions,allow_other,attr_timeout=0)
mount_command=(./mount.cpfs $loop "$DIR" -f "${OPTS[@]}")
sudo "${mount_command[@])"
在 bash 脚本中完成了大量命令的构建之后,我发现数组比试图找出正确的引用(如果可能的话)来在简单的字符串中维护命令要优越得多。
关于linux - 在 bash 变量赋值中引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3665533/