我有一个输入文件,它有以下数据:
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
========================================"
连接"标准输入到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,还适用于任何读取stdin的命令,包括mplayer, ffmpeg, HandBrakeCLI等。
为了防止出现这种情况,可以将-n选项传递给ssh命令从/dev/null读取,而不是stdin。其他命令有类似的标志,或者你可以普遍使用/blockquote>