Добрый день!
есть переменная 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. Если есть идеи, буду очень признателен.