gpt4 book ai didi

linux - 在 bash 变量赋值中引用

转载 作者:太空狗 更新时间:2023-10-29 11:40:04 24 4
gpt4 key购买 nike

使用以下简化的代码摘录:

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 没有被引用,所以 ab 作为不同的参数传递,而不是相同的传递给 。/mount.cpfs.

创建这样的命令序列,然后将其扩展到后续命令行的最佳方法是什么?

请记住代码示例已简化为核心问题,我在几个地方使用了 mount_command 并在其前后添加了各种内容,DIR 是由用户传入。在分配给 mount_command 时,我尝试了几种引用 DIR 的组合,以及使用数组的原始尝试。

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com