Я созерцаю, чтобы сделать все сценарии 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
Он преобразует $ {идентификатор} до «$ идентификатор», за исключением случаев, когда непосредственно перед или после цитаты, но терпит неудачу чтобы обнаружить, если мы глубже внутри строки.
«Мое регулярное выражение не разрезало его». Можете ли вы показать, что вы пробовали, и в каких случаях это не удалось? Это благородное начинание кстати. Меня бы интересовали решения. – VM17
В основном вам нужен парсер 'bash', чтобы определить, какие расширения параметров цитируются, а какие нет. Регулярных выражений недостаточно для такого разбора. – chepner
@chepner - Действительно, особенно потому, что 'bash' не является [обычным языком] (https://en.wikipedia.org/wiki/Regular_language). – antiduh