linux - 在 bash 变量赋值中引用

标签 linux bash shell ubuntu

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

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由用户传入。我尝试了几种引用 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/

相关文章:

linux - git pull 从克隆的远程分支

linux - 运行此 sh 脚本后无法生成 *.deb 文件

linux - 在字符串 bash 中连接变量

linux - ./要执行的文件路径不执行

java - 如何在 Java 进程中等待子进程完成?

arrays - Bash 多个命令行参数

linux - docker run 中的 Dockerfile 入口点脚本参数

linux - 容器内的 virt-install 命令

bash - 对bash中所有子文件夹的所有图像执行命令

linux - 在文件过滤方面需要帮助