пустое значение в цикле foreach - TCL - скрипт Unix - PullRequest
0 голосов
/ 26 марта 2019

Я получаю пустые значения для переменной $ tclItem в приведенном ниже скрипте в цикле foreach, хотя список содержит значения.

Не могли бы вы проверить и посмотреть, что мне не хватает?

FTP_USER="xxxxx"
FTP_SERVER="xxxxx"
FTP_PWD="xxxx"
FTP_DROP_DIR="DROP/Archive"
LOGFILE="\tmp\log.txt"

FILES_TO_ARCHIVE="$(cat $LOGFILE | grep '.txt' | awk ' !/Fetching/' | tr -d '\r') "
echo "Files to Archive..."
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
echo $FILES_TO_ARCHIVE
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"


expect <<END 
 spawn sftp $FTP_USER@$FTP_SERVER
 expect "*password: " 
 send "$FTP_PWD\r";
 expect "sftp> "

foreach tclItem {$FILES_TO_ARCHIVE } {
 #puts $tclItem
 send "ls $FTP_DROP_DIR/$tclItem\r"
 expect "sftp> "
};
 send "quit\r"
END

и вот вывод, который я получаю.

Files to Archive.....
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
test1.txt test2.txt test3.txt test4.txt
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

spawn sftp abcdef@sftp.server.com
abcdef@sftp's password:
sftp> ls DROP/Archive/
sftp> ls DROP/Archive/
sftp> ls DROP/Archive/
sftp> ls DROP/Archive/
sftp> invalid command name "test2.txt"
    while executing
"test2.txt"

1 Ответ

1 голос
/ 26 марта 2019

Вместо использования подстановки строк для ввода данных в код (практика, чреватая проблемами безопасности), передайте переменные от bash до expect через среду.

# Environment variables should be lowercase except for special/reserved names meaningful
# to the operating system; http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html

ftp_user="xxxxx"
ftp_server="xxxxx"
ftp_pwd="xxxx"
ftp_drop_dir="DROP/Archive"
logfile="/tmp/log.txt"
files_to_archive="$(awk '/[.]txt/ && !/Fetching/' <"$logfile" | tr -d '\r')"

export ftp_user ftp_server ftp_pwd ftp_drop_dir files_to_archive

expect <<'END'
 spawn sftp $env(ftp_user)@$env(ftp_server)
 expect "*password: " 
 send "$env(ftp_pwd)\r";
 expect "sftp> "

 set fileList [split $env(files_to_archive) "\n"]

 foreach tclItem $fileList {
   send "ls $env(ftp_drop_dir)/$tclItem\r"
   expect "sftp> "
 };
 send "quit\r"
END

Примечание:

  • Использование export делает переменные оболочки доступными в качестве переменных среды в подпроцессах. Ожидается, что $env(foo) позволяет прочитать переменную окружения foo.
  • Использование <<'EOF' вместо <<EOF приводит к тому, что bash передает код expect точно как есть, без изменений. (Таким образом, $tclItem остается $tclItem вместо того, чтобы заменяться пустой строкой до того, как expect даже запустится).
...