Redhat Shell脚本条件testing语义

我使用的是Redhat Enterprise 5.3,我有一个小脚本来读取目录名称并将其与variables进行比较。 有些东西似乎导致它认为我试图让它运行目录名称作为一个命令,它也没有正确评估目录名称对string…(目录名称是“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 

与shell的string比较是棘手的。 每个人都想使用“如果”和“testing”,但是还有另一种结构对于string匹配非常有效。

if结构实际上只是检查在if后面运行的最后一个东西的退出状态。 “[”实际上是程序“testing”,可以进行string比较,但也可以做其他事情,如检查目录条目是链接还是目录或文件。

另外,如果在该目录中有多个目录条目,或者如果你有一个带有空格的名字,variables= $(ls)结构可能会做坏事。 你更安全的让shell像for循环一样为你做globbing。

把它们放在一起:

 #!/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 

$ {foo}是在bash中取消引用数组元素的语法。 其他答案指出了它在variables评估中的一般用法,但是这里不需要它。 你可能只想比较一下

 [ $RESULT = $TEST ] 

你在找一个名叫ll_bkup的目录吗? 你可以做

 [ -d ll_bkup ] 

为“ll_bkup存在,是一个目录”。 如果是文件,请使用-f。

如果你正在寻找只有 ll_bkup的内容,你也可以做一个testing

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

看看“man test”你可以使用的语法。

可能有一个更简洁的方法来做到这一点,但一次只学习一个部分,可以让你对这些部分有一个很好的理解,并且可以使用像find这样的工具来进行更有趣的testing。

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

即:

if [$RESULT = $TEST]; then

应该:

if [ $RESULT = $TEST ]; then

这是因为[实际上是一个命令,不仅仅是bash中的一些语法(尽pipe我相信这里有一个bash内build的东西!!)。

例如,如果您在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之前有空格)

那有意义吗?

 Still get the same results with that syntax: 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 

Jason说,空间就是你需要的。

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

你的情况应该没有什么不同。 $ {foo} 不仅仅是一个在bash中取消引用数组元素的语法。

这是访问variables的更好方法。 检查这个。