引用bash变量赋值

Mat*_*ner 2 linux bash shell ubuntu

使用以下简化代码提取:

DIR='a b'
mount_command="./mount.cpfs $loop $DIR -f $OPTS"
sudo $mount_command
Run Code Online (Sandbox Code Playgroud)

跟踪打开时执行此行:

+ sudo ./mount.cpfs /dev/loop0 a b -f -o default_permissions,allow_other,attr_timeout=0
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

Update0

请测试你的建议,我不认为解决方案是直截了当的.

cam*_*amh 5

bash的最佳方法是使用数组.数组将保持单独分隔的单词,并在单个单词中保留空格:

DIR='a b'
mount_command=(./mount.cpfs $loop "$DIR" -f $OPTS)
sudo "${mount_command[@]}"
Run Code Online (Sandbox Code Playgroud)

"${mount_command[@]}"膨胀时,各元件被扩展为一个参数sudo,即使其具有空间.

请注意我是如何引用"$DIR"但不是$OPTS,因为您$OPTS包含多个要作为单独的单词传递给mount命令但$DIR应该保持在一起的单词.但是,您可以使OPTS成为一个数组,mount_command并在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[@])"
Run Code Online (Sandbox Code Playgroud)

在bash脚本中完成了大量的命令构建后,我发现数组远远优于试图找出正确的引用(如果可能)以将命令保存在一个简单的字符串中.