Добрый день!
есть переменная a, в которой предполагается хранить команды shell любой сложности для последующей записи этой команды в БД. Для этого мне нужно экранировать все спецсимволы $, чтобы bash не обрабатывал конструкцию $(..), которая будет возвращать результат выполнения команды.
Я думаю решить эту задачу с помощью sed, как указано в скрипте:#!/bin/bash
a="for personal in $(/bin/awk -F":" '{ if ( $5 ~ /Admin / && $3 > 100 ) print $1 }' /etc/passwd); do passwd -S $personal;done"
b=$(sed 's,$,\\$,g' <<< $a)
echo $bНо результат получается не тот, который я ожидал:
for personal in user1\$ user2\$ user3;do passwd -S ;done\$
Очевидно сработала обработка bash подстановки команды.Если бы я в строке руками экранировал все символы $:
#!/bin/bash
a="for personal in \$(/bin/awk -F":" '{ if ( \$5 ~ /Admin / && \$3 > 100 ) print \$1 }' /etc/passwd); do passwd -S \$personal;done"
echo $aТо результат был бы правильным:
for personal in $(/bin/awk -F":" '{ if ( $5 ~ /Admin / && $3 > 100 ) print $1 }' /etc/passwd); do passwd -S $personal;doneВидимо, что-то я не так делаю в команде sed. Если есть идеи, буду очень признателен.
вместо муйней хаяться для начала можно посмотреть на разницу в обработке строк в одинарных и в двойных кавычках и понять какие когда нужны. потом не забыть посмотреть на экранирование этих самых кавычек внутри кавычек. на закуску почитать про мультилайн переменные и прочий cat << EOF и переосмыслив подход подойти к задаче с правильной стороны.
Аффтар, опиши реальную задачу, которая перед тобой стоит. А не одно из ошибочных решений. https://xyproblem.info/
> Добрый день!
> есть переменная a, в которой предполагается хранить команды shell любой сложности
> для последующей записи этой команды в БД. Для этого мне нужнопроблема как вы очевидно понимаете, в том что вы задаете переменную в самом теле скрипта, и уже на момент ее определения - интерпретатор выполняет все необходимые подстановки.
если вы будете брать строки из файла- то в момент чтения такой строки в переменную- спец-символы будут просто символами и их можно экранировать регекспом.
> экранировать все спецсимволы $, чтобы bash не обрабатывал конструкцию $(..), котораявы уверены что в БД нужно хранить именно строки "как есть" с экранированием? ведь можно сразу, ничего не экранируя закодировать строку в base64 и хранить в базе строки base64...
> есть переменная a, в которой предполагается хранить команды shell любой сложности
> для последующей записи этой команды в БД.Автор, ты столько проблем себе создаешь на ровном месте. Не забудь еще что БД, если это SQL какой-то, тоже надо экранирование. При том - отличное от экранирования shell. И в целом написать такую конструкцию в безопасном виде - будет очень нетривиально, особенно если ты не эксперт. Так что закончиться это все может довольно печально, взломамми и уязвимостями. Может, какие-то более подходящие для работы инструменты взять?