Próbuję sprawdzić, czy określony wiersz w nazwie pliku znajduje się na hoście. Zatem tylko jeśli określony wzór zostanie znaleziony w poleceniu grep, zostanie utworzony plik dummy.txt. Następnie chcę sprawdzić, czy plik dummy.txt istnieje jako warunek, i kontynuować.
Ale mimo że tworzony jest plik dummy.txt, nie można go znaleźć w instrukcji if:
if {[file exists $fileName] }
i kontrola jest przenoszona do bloku else. Co może być przyczyną? Czy jest jakiś łatwiejszy sposób na osiągnięcie tego, co próbuję?
set Host [lindex $argv 0 ]
spawn ssh -o StrictHostKeyChecking=no userid@$Host
expect "*assword*"
send "password\n"
expect "+"
send "cd path/that/contains/filename\n"
expect "*$*"
send "pwd\n"
set fileName dummy.txt
send {grep '\[abc\]' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
send "\n"
expect "+"
send {grep 'xyz' filename | wc -l | { read line; [ "$line" != "0" ] && echo "$line"> dummy.txt; }}
send "\n"
expect "+"
send "chmod 777 dummy.txt\n"
if {[file exists $fileName] } {
send {printf "\nabc xyz already exists"}
send "\n"
expect "+"
send "ls -l\n"
expect "+"
send "rm dummy.txt\n"
expect "+"
send "ls -l\n"
expect "+"
send "exit\n"
} else {
send {printf "cannot find $fileName"}
send "\n"
expect "+"
send {printf "\n[abc]\nxyz\n" >> filename}
send "\n"
expect "+"
send "cat filename\n"
expect "+"
send "exit\n"
}
bash
unix
shell-script
expect
użytkownik417721
źródło
źródło
wc | read ...
możesz po prostu sprawdzić kod powrotu grep (0 = znaleziono dopasowanie, zobaczman grep
).Odpowiedzi:
if {[file exists $fileName] }
sprawdzi, czy plik istnieje w systemie lokalnym (tym, w którymexpect
działa), ale warunkowo utworzony plik będzie na zdalnym hoście (tym, do którego loguje się skryptssh
), jeśli istnieje. Równieżfilename
todummy
, ale warunkowo tworzony jest plikdummy.txt
.źródło
send {grep -q xyz filename || echo xyz >> filename}
.send {[ -f dummy.txt ] && echo "xyz abc" >> filename}
. Lub przeczytaj ponownie mój najnowszy komentarz.