Какие из моих двойных и одинарных кавычек мне нужно экранировать в моем скрипте Bash? - PullRequest
1 голос
/ 22 апреля 2011

У меня есть эта строка в цикле for в скрипте bash:

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 ]

2 голосов
/ 22 апреля 2011

старайтесь не избегать некоторых из ваших одинарных кавычек. У меня нет gvpr или fdp, поэтому я не смог проверить. Но вы можете попробовать и сообщить мне результат

#!/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 голосов
/ 22 апреля 2011

Выход из внешних одинарных кавычек определенно был бы неправильным (как в \'N{pos=\"\"}\').Одинарные кавычки не оценивают переменные (с $) внутри них.Таким образом, необходимо избегать только одинарных кавычек внутри одинарных кавычек.

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

... должно работать с синтаксической точки зрения.Конечно, я не знаю команд gvpr и fdp, чтобы судить, что они ожидают.

В любом случае, '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"
0 голосов
/ 22 апреля 2011

Если вы хотите сохранить внешние одинарные кавычки в '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

(Вам не нужно экранировать двойные кавычки в одиночных кавычках.)

...