Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何在unix中使用嵌套if并执行正确的文件检查_Shell_If Statement_Unix - Fatal编程技术网

Shell 如何在unix中使用嵌套if并执行正确的文件检查

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

需要一些shell脚本帮助,尤其是我的
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