Shell 如何在unix中使用嵌套if并执行正确的文件检查
需要一些shell脚本帮助,尤其是我的Shell 如何在unix中使用嵌套if并执行正确的文件检查,shell,if-statement,unix,Shell,If Statement,Unix,需要一些shell脚本帮助,尤其是我的if-then-else逻辑。我想将这两种情况结合起来,但不确定文件检查的效果是否相同?我应该做一些类似嵌套if的事情吗??我的脚本使用if语句执行文件检查,查看它们是否存在,然后执行一些操作 可能还有一种更好的方法来进行文件检查 任何帮助、批评都将不胜感激。谢谢 这是我的代码,它可以正常工作 if [ $# != 1 ]; then echo "Usage: getlogs.sh <remote-host>" 2>&1
if-then-else
逻辑。我想将这两种情况结合起来,但不确定文件检查的效果是否相同?我应该做一些类似嵌套if的事情吗??我的脚本使用if
语句执行文件检查,查看它们是否存在,然后执行一些操作
可能还有一种更好的方法来进行文件检查
任何帮助、批评都将不胜感激。谢谢
这是我的代码,它可以正常工作
if [ $# != 1 ]; then
echo "Usage: getlogs.sh <remote-host>" 2>&1
exit 1
fi
#Declare variables
STAMP=`date '+%Y%m%d-%H:%M'`
REMOTE_MYCNF=/var/log/mysoft/mysoft.log
REMOTE_GZ=/var/log/mysoft/mysoft.log.1.gz
REMOTE_DIR=/var/log/mysoft/
BACKUP_DIR=/home/mysql/dev/logs/
NEWLOG="foo-temp.log"
export REMOTE_MYCNF STAMP SHORTNAME
export REMOTE_DIR REMOTE_GZ
#Copy file over
echo "START..." 2>&1
test -f $BACKUP_DIR$1.mysoft.log
if [ $? = 0 ]; then
echo "Local log file exists, clean up for new copy..." 2>&1
/bin/rm $BACKUP_DIR$1.mysoft.log
exit 0
else
echo "File does not exist, getting a new copy..." 2>&1
fi
echo "Checking remotely in $1 for foo logfile $REMOTE_MYCNF $STAMP" 2>&1
if [ ! -f $REMOTE_MYCNF ]; then
echo "File exists remotely, creating new logfile and copy here...." 2>&1
ssh $1 "zcat $REMOTE_GZ >> $REMOTE_DIR$NEWLOG"
ssh $1 "cat $REMOTE_MYCNF >> $REMOTE_DIR$NEWLOG"
/usr/bin/scp $1:$REMOTE_DIR$NEWLOG $BACKUP_DIR$1.mysoft.log
echo "end remote copy" 2>&1
echo "Cleaning up remote files" 2>&1
ssh $1 "rm $REMOTE_DIR$NEWLOG"
exit 0
else
echo "Unable to get file" 2>&1
exit 0
fi
文件测试可以组合成如下语句:
if [ -f $BACKUP_DIR$1.mysoft.log ]; then
乍一看,您似乎不需要导出任何变量
如果您打算使用If[!-f$REMOTE\u MYCNF];然后在上一个的else
中执行块,如果
,只需将其移动到该块中即可
if ...
then
foo
else
if ...
then
bar
else
baz
fi
fi
如果需要检查两件事:
if [ "$foo" = "bar" && "$baz" = "qux" ]
总是引用你的变量
在短脚本中,可以直接使用位置参数,如$1
,但如果在顶部附近为具有有意义名称的变量赋值,则长脚本更容易理解
remote_host=$1
当您想向stderr回显错误时,请按以下方式执行:
echo "Message" >&2
按照您的方式,您正在向stdout回显消息以及回显本身可能产生的任何错误(非常罕见)。@Dennis W.-谢谢您的帮助。我根据您的建议做了一些更改(参见上面的更新代码)。但是,我对当前的逻辑有一个问题,特别是在if语句中。如果本地文件存在,我想删除该文件,然后将远程文件的新副本带过来。发生了什么,当我第一次运行时,它将删除文件并完全退出。下次我再次运行它时,它工作正常,因为本地文件存在,这是正常的。但我希望它总是从远程服务器带来一个新的副本。如果我说得通的话。谢谢。@jda6one9:那么您的if
块不应该嵌套。结构应该更像第一个版本。另外,我在第一次阅读时遗漏了一点,即除非出现错误或有理由退出脚本,否则不应该退出exit
。按照现在的方式,它在任何操作后都会退出。删除本地文件后的文件是导致问题的文件。一般来说,进入程序和退出程序(或脚本、函数等)的路径越少越好(有些人坚持单向进入和单向退出)@Dennis:你告诉always引用变量,然后在remote\u host=$1
@中犯同样的错误。Roman:你通常不必在赋值中引用变量,因为那时没有进行分词。
echo "Message" >&2