Грязная переменная удара

Я пишу сценарий в 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-й раздел. Проигрывание с кавычками и \немного, я, казалось, получил ошибку о "{печать" команда, не найденная и т.д., как будто была новая строка там где-нибудь.

5
задан Kyle 18 March 2010 в 18:38
поделиться

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
5
ответ дан 14 December 2019 в 19:09
поделиться

постарайтесь максимально использовать синтаксис $ ()

VAR=$(ssh $i "awk -F: '/^bar/ {print \$2}' /local/foo.txt")
0
ответ дан 14 December 2019 в 19:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: