如何在bash shell脚本中编写条件if语句?

ars*_*nal 0 linux shell bash ubuntu

我有一个下面的 shell 脚本,它将从 machineB 和 machineC 中的当前目录中获取最新的文件夹。所以我想出了下面的命令,它会在里面找到最新的文件夹 -

/bat/data/snapshot

最新的文件夹将采用 YYYYMMDD 的形式。下面是我的 shell 脚本 -

#!/bin/bash

readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot

dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)

echo $dir1
echo $dir2

length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")

echo $length1
echo $length2

if [ $dir1 eq $dir2 ] && [length1 > 0] && [length2 > 0]
then
    echo "Hello World"
Run Code Online (Sandbox Code Playgroud)

现在我需要编写条件 if 语句。我需要检查是否dir1等于dir2length1大于0并且length2也大于0然后只打印输出Hello World

但不知何故,我上面的 if 语句不起作用。知道我在这里做错了什么吗?我在 bash 脚本方面有点生疏..

Rob*_*een 5

它应该是

if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
Run Code Online (Sandbox Code Playgroud)

请记住,变量名必须以$s开头。必须使用 来完成字符串相等比较=,而应该使用命名算术运算符(如 )来完成数字比较-gt。见help test

请注意,(通常)应该避免使用-o-a测试运算符,因为[当涉及它们时无法可靠地解析其参数,并且操作数看起来像运算符。请改用&&|| shell运算符。

  • 如果你有 bash,就没有真正的理由使用 `[`。正如您刚刚演示的那样,语法绝对是可怕的。改用`[[`,它的语法要好得多。 (2认同)