Redhat Shell 脚本条件测试语义

Redhat Shell 脚本条件测试语义

我使用的是 Redhat Enterprise 5.3,我有一个小脚本,可以读取目录名并将其与变量进行比较。似乎有什么东西让它认为我试图让它将目录名作为命令运行,而且它也没有正确地根据字符串评估目录名……(目录名是“ll_bkup”):

脚本:

#!/bin/bash
# Changes backup folder to standard name after LogLogic System Stores a session number in t$
#TCJ 6/1/09

declare RESULT
cd /home/storegrid/scripts/test/backup
RESULT=$('ls')
TEST="ll_bkup"

if ["${RESULT}" = "${TEST}"]; then
        echo "it's ll_bkup"
else
        echo $RESULT
fi

exit 0

结果:

[root@NB-BACKUP-01 backup]# sh /home/storegrid/scripts/test/nb-script-changellbackup.sh
/home/storegrid/scripts/test/nb-script-changellbackup.sh: line 10: [ll_bkup: command not found
ll_bkup

答案1

使用 shell 进行字符串比较比较棘手。每个人都想使用“if”和“test”,但还有另一种结构非常适合字符串匹配。

if 结构实际上只是检查 if 之后运行的最后一个操作的退出状态。“[”实际上是程序“test”,它可以进行字符串比较,但也可以执行其他操作,例如检查目录条目是链接、目录还是文件。

此外,如果目录中有多个目录条目,或者名称中有空格,则 variable=$(ls) 结构可能会造成不良影响。使用 for 循环之类的方法让 shell 为您完成通配符操作更为安全。

把所有内容放在一起:

#!/bin/sh
default_name=ll_bkup

if
  cd /home/storegrid/scripts/test/backup
then
  for result in *
  do
    case "$result"
    in
      "$default_name")
          if 
            test -d "$result"
          then
            echo "the default directory exists"
          else
            echo "the default directory exists but is not a directory!!"
            exit 33
          fi
         ;;
       *)
         if
           test -d "$result"
         then
           echo "non-standard directory $result exists"
         else
           echo "file named $result exists in directory $(pwd)"
         fi
        ;;
    esac
  done
else
  echo "directory doesn't exist or permission problem!"
  exit 40
fi

答案2

${foo} 的语法如下在 Bash 中取消引用数组元素。其他答案指出它在变量求值中的一般用途,但你在这里不需要它。你可能只想比较

[ $RESULT = $TEST ]

您是否在寻找名为 ll_bkup 的目录?您可以这样做

[ -d ll_bkup ]

对于“ll_bkup 存在并且是一个目录”。如果它是一个文件,请使用 -f。

如果你正在寻找仅有的ll_bkup,你也可以做一个测试

[ $(ls | wc -l) == 1 ]

查看“man test”了解可以使用的语法。

可能有更简洁的方法来做到这一点,但一次学习一个部分可以让你很好地理解各个部分,并且你可以使用以下实用程序进行更有趣的测试寻找

答案3

在第二个例子中,你需要在 ' 后面加一个空格[' 和 ']' 字符。

IE:

if [$RESULT = $TEST]; then

应该:

if [ $RESULT = $TEST ]; then

这是因为[实际上是一个命令,而不仅仅是 bash 中的一些语法(尽管我相信 bash 有一个内置命令[也!!)。

例如如果你在 shell 中运行以下命令:

# ls -l /usr/bin/[

它应该显示一个可执行文件,例如:

-rwxr-xr-x 1 root root 43648 2008-10-13 19:20 /usr/bin/[

所以你的脚本没有尝试运行ll_bkup,而是尝试运行一个名为[ll_bkup——当然不存在。

你真正想要运行的[参数为“ $RESULT = $TEST ]

(不带引号,但在 $RESULT 前有空格)

那有意义吗?

答案4

正如杰森所说,空间就是你所需要的。

if [ $RESULT = $TEST ]; then
    ^ space here    ^ and here

在你的情况下,{} 应该没有什么区别。${foo} 是不只是Bash 中取消引用数组元素的语法。

这是访问变量的更好方法。检查这。

相关内容