我使用的是 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 中取消引用数组元素的语法。
这是访问变量的更好方法。检查这。