有没有办法在Linux中将花括号作为bash脚本的命令行参数

问题描述

我想提供一个类似地图的结构作为bash脚本的参数。我尝试了以下方法,它们正在起作用。

1. bash src.sh b:\{x:1,y:2}
2. bash src.sh b:'{x:1,y:2}' 
   "{}" also works

在第一种方法上,当我在另一个脚本中使用命令时,在括号(\内可能存在换行符的情况下,会弄乱。

bash src.sh b:\{x:1,\
    y:2}

y:2} part is missing

第二种方法还不错,但是当换行符位于引号\内时,它在参数内包含''

bash src.sh b:'{x:1,\
    y:2}'

argument will be b:{a:1,\ b:2}

为什么我不能直接将{}交给bash脚本?有没有更好的方法来赋予{}或全新的方法来赋予上述类似地图的结构。

解决方法

为什么我不能直接将{}交给bash脚本?有没有更好的方法来赋予{}或全新的方法来赋予上述类似地图的结构。

用作brace expansion时,{}都不会以特殊方式处理(除非您很不幸并且碰巧将它们组合成一个{{3 }}或parameter expansion)。在您的情况下,它们只是字符串中的普通字符-但为避免将来出现任何麻烦,请考虑在参数'周围加以避免字符串内插。

给出此脚本:

for var in "$@"
do
    echo ">$var<"
done

和此输入

b:\{x:1,\
    y:2}

您得到的输出

>b:{x:1,<
>y:2}<

第一部分在$1中,第二部分在$2中的原因是,y前面有空格,因此正常的参数拆分起作用了。在这种情况下,换行并不重要(它不是字符串的一部分)。如果您改为输入以下内容:

b:\{x:1,\
y:2}

您将获得以下输出:

>b:{x:1,y:2}<

如果您想将所有参数串联在一起,只需使用"$@"

var="$@"    # or just  var=$@