Использование for для l oop внутри как оператора sh заменяет переменную пустой строкой - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий оператор в сценарии bash:

ssh $host "cd /directory; for i in *$date.gz; do echo $i; done; exit"

Я ожидаю, что он напечатает имя каждого файла в каталоге, который заканчивается датой, и является файлом zip. Путем s sh -ing к хосту в командной строке и поиска в каталоге, я обнаружил, что должно быть 5 таких файлов. Однако этот скрипт возвращает 5 пустых строк. Я проверил, правильно ли была определена переменная $date внутри кавычек (так было). Когда я заменил $i на 'adf', скрипт напечатал

adf
adf
adf
adf
adf

Так что он правильно отфильтровывает эти 5 файлов, но просто не печатает их имена, а заменяет $i в заявление с пустым (так что эта строка просто echo). Почему это происходит, и как я могу заставить его печатать имена файлов? То же самое происходит, когда я запускаю эту строку в командной строке.

1 Ответ

1 голос
/ 12 марта 2020

При двойных кавычках в вашей команде расширение переменной происходит перед вызовом ssh.

Поэтому, когда вы вызываете эту командную строку:

ssh $host "cd /directory; for i in *$date.gz; do echo $i; done; exit"

Он вызывает команду ssh с двумя аргументами: $host и "cd /directory; for i in *$date.gz; do echo $i; done; exit"

Второй аргумент выбирает содержимое переменной date и переменной i при построении строки. Но в настоящее время вы НЕ имеете правильного значения для i.

Я думаю, что экранирование $i в \$i должно решить вашу проблему:

ssh $host "cd /directory; for i in *$date.gz; do echo \$i; done; exit"
...