我使用的是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的更好方法。 检查这个。