Я пишу сценарий в ssh в к списку машин и сравниваю переменную с другим значением.. Я столкнулся с проблемой (у меня есть пара обходных решений, но в этой точке я просто задаюсь вопросом, почему этот метод не работает).
VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
($i был бы именем хоста. Хостам доверяют, никакая подсказка пароля не дана),
Пример foo.txt:
foo:123456:abcdef
bar:789012:ghijkl
baz:345678:mnopqr
Я предполагаю, что это - проблема с кавычками, или \было нужно где-нибудь. Я попробовал несколько методов (другое заключение в кавычки, с помощью $ () вместо'', и т.д.), но, может казаться, не разбирается в нем. Мой сценарий работает правильно с помощью следующего:
VAR=`ssh $i "grep bar /local/foo.txt" | awk -F: '{print \$2}'`
Как я сказал, просто любопытство, любой ответ ценится.
Забыл отправлять, каков мой вывод был: awk выкладывает целую подобранную строку, не 2-й раздел. Проигрывание с кавычками и \немного, я, казалось, получил ошибку о "{печать" команда, не найденная и т.д., как будто была новая строка там где-нибудь.
sshd передает вашу команду bash для выполнения, поэтому она пройдет через интерпретатор bash на удаленной стороне, а также на стороне, на которой вы выполняете сценарий. Давайте посмотрим на вашу команду:
VAR=`ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
Вы правильно экранировали $2
для вашей локальной машины, чтобы выполняемый вами сценарий bash не интерпретировал его. Но все кавычки удаляются к тому времени, как он попадает в awk (я не совсем уверен, почему удаляются внутренние кавычки), и он выполняет следующее:
awk -F: /^bar/ {print $2} /local/foo.txt
bash на удаленной стороне видит $2 и заменяет его пустой строкой, оставляя вам следующее:
awk -F: /^bar/ {print } /local/foo.txt
Вот почему он печатает всю строку. Как же это исправить? Вы можете экранировать то, что будет выполнять bash на удаленной стороне, косой чертой, например так:
VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \\\$2}' /local/foo.txt"`
Также вы можете просто повторить команду, чтобы увидеть, что на самом деле выполняет bash для отладки любых дальнейших проблем, с которыми вы столкнетесь:
VAR1=`ssh $i localhost "echo awk -F: '/^bar/ {print \$2}' /local/foo.txt"`
echo VAR1: $VAR1
Execute it and see this output and see right away that it has removed $2:
VAR1: awk -F: /^bar/ {print } /local/foo.txt
постарайтесь максимально использовать синтаксис $ ()
VAR=$(ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt")