2016-12-12 1 views
3

Я созерцаю, чтобы сделать все сценарии bash большой кодовой базы shellcheck совместимыми, но задача огромна, потому что слишком многие разработчики исторически игнорировали правило номер один из всех сценариев оболочки: always use quotes.Инструмент для автоматической перезаписи сценария bash с правильной цитатой?

Было бы полезно, если бы был инструмент, который мог бы исправить хотя бы цитирование. Тогда я смогу исправить остальное вручную. Мое регулярное выражение не сократило его, потому что только переменные не уже в строке должны быть указаны.

вход

Пример:

echo "Removing $a ${b} $(c $(c)) `d $d` ${10} [email protected] now" 
rm -rf $a ${b} $(c $(c)) `d $d` ${10} [email protected] 

Пример вывода:

echo "Removing $a $b $(c "$(c)") `d "$d"` ${10} [email protected] now" 
rm -rf "$a" "$b" "$(c "$(c)")" "$(d "$d")" "${10}" "[email protected]" 

Он не должен фиксировать все выше, и он даже не должен быть безупречным (хотя это было бы действительно приятно), но он должен быть прав чаще, чем не быть полезным.


Вот мой наивный регулярное выражение, которое не сокращали его:

s:([^"])\$\{([_A-Za-z0-9]+)\}([^"]|$):\1"\$\2"\3:g 

Он преобразует $ {идентификатор} до «$ идентификатор», за исключением случаев, когда непосредственно перед или после цитаты, но терпит неудачу чтобы обнаружить, если мы глубже внутри строки.

+2

«Мое регулярное выражение не разрезало его». Можете ли вы показать, что вы пробовали, и в каких случаях это не удалось? Это благородное начинание кстати. Меня бы интересовали решения. – VM17

+2

В основном вам нужен парсер 'bash', чтобы определить, какие расширения параметров цитируются, а какие нет. Регулярных выражений недостаточно для такого разбора. – chepner

+0

@chepner - Действительно, особенно потому, что 'bash' не является [обычным языком] (https://en.wikipedia.org/wiki/Regular_language). – antiduh

ответ

2

Я сделал свою собственную версию (потому что я хотел, WPomier бить меня к нему):
https://github.com/anordal/naziquote

Он действует как подсветки синтаксиса, пока вы не дать ему возможность --besserwisser.

1

Это не существующий инструмент, но небольшая программа на C, которая может помочь вам в качестве базы, чтобы получить то, что вы хотите.

Вы можете увидеть это here.

Пример:

$ cat script.sh 
echo "Removing $a ${b} $(c $(c)) `d $d` ${10} [email protected] now" 
rm -rf $a ${b} $(c $(c)) `d $d` ${10} [email protected] 

$ checkshellvar < script.sh 
echo "Removing $a ${b} $(c $(c)) `d $d` ${10} [email protected] now" 
rm -rf "$a" "${b}" "$(c "$(c)")" "$(d "$d")" "${10}" "[email protected]" 

Отказ от ответственности: Программа обеспечивает ваш пример вывода, но я сделал это в моем кофе-брейк, так что не ожидайте слишком много ;-)

Примечание: Несмотря на эту программу, я полностью уверен, что кавычки в сценариях оболочки имеют смысл, и их отсутствие или использование одиночных или двойных кавычек совершенно справедливо в зависимости от обстоятельств.

+0

Первый коммит - это бит crashy :-( – user2394284

+0

Я сказал вам, что сделал это на кухне :-) Я добавил поддержку одного аргумента (имя файла), чтобы его отладить. Я тестировал многие свои собственные скрипты, и теперь он выглядит нормально. – WPomier

+0

Именно то, что я просил. Не идеально, но полезно с правильным зерном соли. Вы упомянули, что heredocs не поддерживается, поэтому я буду обрабатывать эти файлы вручную. – user2394284

Смежные вопросы