我有一個輸入檔案,其中包含以下資料:
driver2:y
driver5:y
driver3:n
driver1:y
driver4:y
要求是,對于每個驅動程式,如果值為“y”,則腳本必須檢查是否存在與該驅動程式相關的一組檔案。如果它們都存在,則只應執行與該驅動程式相關的下一步。
主腳本從 input.txt 檔案中逐行讀取。我正在為此使用 CASE。
我的問題是當我嘗試從 CASE 邏輯中呼叫 function_exists() 時(如您所見,在腳本中進行了注釋)或者如果我使用任何“IF”條件而不是 function_exists() 來執行相同的檢查,那特別CASE 邏輯中的一部分正在執行(比如 driver2,“driver2)”下的所有代碼都執行)并且腳本控制自動退出 CASE 邏輯并且腳本正在結束,而不從輸入檔案中讀取剩余的行。
該腳本正在讀取所有條目,但是當我使用函式和 IF 條件時,CASE 邏輯出現了問題。
我無法理解腳本出了什么問題,我在這里犯了什么錯誤。有人可以幫我弄這個嗎?
#!/bin/sh
function_exists ()
{
ssh $remote_server "test -e $1"
if [ $? == 0 ]
then
echo "file found : $1"
else
echo "file not found : $1"
fi
echo "***** exiting function"
}
remote_server="vmlinux1"
input="input.txt"
while IFS= read -r line
do
IFS=":"
read -ra arr <<< "$line"
driver=${arr[0]}
export driver=$driver
driverInstall=${arr[1]}
echo "read value" $driver $driverInstall
if [ $driverInstall == 'y' ]; then
case $driver in
driver1)
echo "entered driver 1"
#function_exists /opt/installer/file1.txt
echo "***** control came back to $driver"
;;
driver2)
echo "entered driver 2"
#function_exists /opt/installer/file2.txt
echo "***** control came back to $driver"
continue
;;
driver4)
echo "entered driver 4 - for directory check"
#function_exists /opt/installer/directory1
echo "***** control came back to $driver"
;;
*)
echo "${driver} - NOTHING DEFINED"
;;
esac
else
echo "${driver} - SKIPPED "
fi
done < "$input"
echo "Script ended
========================================"
uj5u.com熱心網友回復:
將“ssh”標準輸入連接到 nirvana,否則 ssh 會吃掉剩余的行。
ssh $remote_server "test -e $1" < /dev/null
# you can also use ssh -n
read value driver2 y
entered driver 2
file not found : /opt/installer/file2.txt
***** exiting function
***** control came back to driver2
read value driver5 y
driver5 - NOTHING DEFINED
read value driver3 n
driver3 - SKIPPED
read value driver1 y
entered driver 1
file found : /opt/dev/python/scrapper/main.py
***** exiting function
***** control came back to driver1
read value driver4 y
entered driver 4 - for directory check
file not found : /opt/installer/directory1
***** exiting function
***** control came back to driver4
Script ended
========================================
問題是您的腳本運行 ssh 命令,并且默認情況下 ssh 從您的輸入檔案 stdin 讀取。結果,您只看到處理的第一行,因為該命令消耗了檔案的其余部分并且您的 while 回圈終止。
這不僅適用于 ssh,而且適用于任何讀取標準輸入的命令,包括 mplayer、ffmpeg、HandBrakeCLI 等。
為防止這種情況,請將 -n 選項傳遞給您的 ssh 命令,以使其從 /dev/null 而不是 stdin 讀取。其他命令有類似的標志,或者你可以通用使用 < /dev/null
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470306.html
上一篇:我們如何在C#中解釋=>something=>something2=>something3
下一篇:np.arange物件不可呼叫
