在我的Bash脚本中,我需要哪个双引号和单引号?

时间:2011-04-22 02:48:20

标签: bash quotes

我在bash脚本的for循环中有这一行:

gvpr -c \'N{pos=\"\"}\' ${FILE} | fdp -o data/${PAD}.${FILE} -Tdot -Nlabel='""' -Nshape=point -Gstart=$RANDOM

我需要脚本运行(在扩展变量之后)以下代码:

gvpr -c 'N{pos=""}' 072.grafo1643.10.planar_drawn.dot | fdp -o data/1.test -Tdot -Nlabel="" -Nshape=point -Gstart=$RANDOM

我不知道如何格式化脚本以使这些命令运行。任何帮助表示赞赏。

以下是整个脚本:

#!/bin/bash

if [ ! -d "data" ]; then
    mkdir data
fi

for FILE in `ls`
do
    if [ $FILE != process.sh ] && [ -f $FILE ]; then
        fdp $FILE -o data/p.$FILE -Nlabel=\"\" -Nshape=point
        for i in {1..100}
        do
            printf -v PAD "%03d" $i
            gvpr -c \'N{pos='""'}\' ${FILE} | fdp -o data/${PAD}.${FILE} -Tdot -Nlabel='""' -Nshape=point -Gstart=$RANDOM
        done
    fi
done

3 个答案:

答案 0 :(得分:2)

转义外部单引号肯定是错误的(如\'N{pos=\"\"}\')。单引号不会在其中评估变量(带$)。因此,只需要对单引号内的单引号进行转义。

gvpr -c 'N{pos=""}' "$FILE" | fdp -o "data/${PAD}.${FILE}" -Tdot -Nlabel="" -Nshape=point -Gstart="$RANDOM"

......应该从句法的角度来看。当然,我不知道命令gvprfdp来判断他们的期望。

无论如何,'data/${PAD}.${FILE}'不会产生你想要的东西,因为你想要扩展里面的变量。因此在我的例子中使用了"data/${PAD}.${FILE}"

哦,你的扩展示例与上面提到的"$FILE""data/${PAD}.${FILE}"在扩展形式上不完全匹配的内容相矛盾;)

假设您的gvpr命令想要再次引用字符串,您必须选择:

gvpr -c '\'N{pos=""}\'' "$FILE" | fdp -o "data/${PAD}.${FILE}" -Tdot -Nlabel="" -Nshape=point -Gstart="$RANDOM"

答案 1 :(得分:2)

尽量逃避一些单引号。我没有gvprfdp因此无法测试。但你可以尝试一下,让我知道结果

#!/bin/bash
mkdir data 2>/dev/null
for FILE in *
do
    if [ "$FILE" != process.sh ] && [ -f "$FILE" ]; then
        fdp "$FILE" -o data/"p.${FILE}" -Nlabel="" -Nshape=point
        for i in {1..100} # if you have Bash 4, you can do {001.100} 
        do
            printf -v PAD "%03d" $i
            gvpr -c 'N{pos=""}' "${FILE}" | fdp -o data/"${PAD}.${FILE}" -Tdot -Nlabel="" -Nshape=point -Gstart=$RANDOM
        done
    fi

done

答案 2 :(得分:0)

如果你想在'N {pos = \“\”}'中保留外部单引号,我会使用:

gvpr -c "'N{pos=\"\"}'" ${FILE} | fdp -o data/${PAD}.${FILE} -Tdot -Nlabel='""' -Nshape=point -Gstart=$RANDOM

其他选择:

gvpr -c \''N{pos=""}'\' ${FILE} | fdp -o data/${PAD}.${FILE} -Tdot -Nlabel='""' -Nshape=point -Gstart=$RANDOM

(您不需要在单引号字符串中转义双引号。)