Какие из моих двойных и одинарных кавычек мне нужно экранировать в моем Bash-скрипте?

#bash #quotes

#bash #кавычки

Вопрос:

У меня есть эта строка в цикле 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 ] amp;amp; [ -f $FILE ]; then
        fdp $FILE -o data/p.$FILE -Nlabel="" -Nshape=point
        for i in {1..100}
        do
            printf -v PAD "d" $i
            gvpr -c 'N{pos='""'}' ${FILE} | fdp -o data/${PAD}.${FILE} -Tdot -Nlabel='""' -Nshape=point -Gstart=$RANDOM
        done
    fi
done
  

Комментарии:

1. покажите весь имеющийся у вас скрипт. и определите «формат».

2. Выдает ли это вам какие-либо конкретные сообщения об ошибках?

3. @bash-o-logist: с вами я бы тоже хотел иметь возможность добавлять пользователя в закладки. Учитывая ваши полезные ответы на данный момент. 🙂

4. @STATUS_ACCESS_DENIED. Я не понимаю, что вы имеете в виду

5. @bash-o-logist: Я ссылаюсь на ответы, которые можно увидеть в вашем профиле. Я заметил ваш (подходящий) ник уже один или два дня назад в вопросе, связанном с оболочкой. И я серьезно. Никакого сарказма не подразумевалось. Среди ваших ответов можно найти несколько драгоценных камней. 🙂

Ответ №1:

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

 #!/bin/bash
mkdir data 2>/dev/null
for FILE in *
do
    if [ "$FILE" != process.sh ] amp;amp; [ -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 "d" $i
            gvpr -c 'N{pos=""}' "${FILE}" | fdp -o data/"${PAD}.${FILE}" -Tdot -Nlabel="" -Nshape=point -Gstart=$RANDOM
        done
    fi

done
  

Комментарии:

1. Это сработало! Я сам не слишком знаком с gvpr, поэтому я не совсем представлял, что будет необходимо. Спасибо за помощь!

Ответ №2:

Экранирование внешних одинарных кавычек определенно было бы неправильным (как в '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"
  

Ответ №3:

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

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

Комментарии:

1. Я думаю, что ваш второй вариант неправильный. Не следует экранировать внешние одинарные кавычки (после -c )? Или я ошибаюсь?

2. В этом отношении два варианта эквивалентны: оба echo «‘N{pos=»»}'» и echo «N {pos=»»}» возвращают ‘N{pos=»»}’ с внешними одинарными кавычками. Из второго кода, предложенного Precision, я делаю вывод, что эта команда gvpr исключает использование одинарных кавычек, и поэтому вам нужно убедиться, что оболочка не удалит их. Я согласен, что это маловероятно, но это то, что было запрошено…

3. Я вижу. Это возможно, да. Это один из вариантов, который я также рассмотрел в своем ответе.