Linux
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
與 shell 的字元串比較很棘手。每個人都想使用“if”和“test”,但還有另一種結構非常適合字元串匹配。
if 結構實際上只是檢查 if 之後執行的最後一個東西的退出狀態。“[”實際上是程序“test”,它可以進行字元串比較,但也可以做其他事情,例如檢查目錄條目是連結還是目錄或文件。
此外,如果您在該目錄中有多個目錄條目,或者如果您的名稱中包含空格,則 variable=$(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