Linux

Redhat Shell 腳本條件測試語義

  • June 18, 2009

我正在使用 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

引用自:https://serverfault.com/questions/28147