В чем проблема с этим кодом? Как передать строковое значение в команды ssh?
Одно из важных различий между цитированием в двойных кавычках ("
) и цитированием в одинарных кавычках ('
) заключается в том, что последний подавляет расширение параметра. Вам нужно либо переместить $file
за пределы кавычек, либо изменить стиль двойной кавычки. Кроме того, однако, вы должны правильно процитировать расширения $file
, иначе вы оставите себя открытым для поломки или даже неприятных сюрпризов в случае необычных имен файлов, таких как те, которые содержат пробелы.
Более того, тот факт, что вы форматируете командную строку, которая будет обрабатываться другой оболочкой, добавляет некоторые сложности. Самый простой способ убедиться, что вы получаете право цитирования, - это использовать встроенную в bash printf
, чья опция форматирования %q
служит именно для того, чтобы заключить в кавычки произвольную строку, чтобы результат можно было перечитать как ввод в оболочку для воспроизведения та же строка. В целом, вот моя рекомендация для цикла:
for file in "${files[@]}"
do
scp "${file}" user@domain.com:~
ssh user@domain.com "PGPASSWORD='abcd' psql -h domain.com -U user -d dbb -f $(printf %q "~/${file}")"
ssh user@domain.com "rm $(printf %q "~/${file}")"
done