#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. Я вижу. Это возможно, да. Это один из вариантов, который я также рассмотрел в своем ответе.