2009-11-30 75 views
0

我編碼了下面的代碼,如果沒有-l或-L選項傳遞給腳本,我需要假設(檢測)文件名是否作爲參數傳遞。如果文件名是一個小寫字符,下面的第三個條件只匹配。我怎樣才能靈活地匹配大小寫字母或可變長度的字符串?如何在case語句中檢測文件名 - 在unix shell中?

while [ $# -gt 0 ] 
    do 

     case $1 in 
      -l)  echo ls;; 
      -L)  echo ls -l;; 
      [a-z]) echo filename;; 
      *) echo usage 
       exit 1;; 
     esac 

     shift 
    done 

此外,如何包含一個條件,在這種情況下,將反應爲空$ 1? 例如,如果腳本被調用時沒有任何選項或文件名。

回答

2

您可以匹配空字符串與'')"")的情況。

文件名可以包含任何字符 - 即使是奇怪的字符都喜歡符號,空格,換行符和控制字符 - 所以試圖通過查找字母和數字來確定文件名是否正確方法來做到這一點。相反,您可以使用[ -e filename ]測試來檢查字符串是否是有效的文件名。

順便說一句,您應該用加雙引號,這樣如果文件名中包含空格,您的腳本就可以工作。

case "$1" in 
    '')  echo empty;; 
    -l)  echo ls;; 
    -L)  echo ls -l;; 
    *)  if [ -e "$1" ]; then 
       echo filename 
      else 
       echo usage >&2 # echo to stderr 
       exit 1 
      fi;; 
esac 
+0

「檢查一個字符串是否是一個有效的文件名」 - 實際上它檢查文件是否存在(如'-e') – 2009-11-30 01:31:37

+0

-e和-f之間有什麼區別? – goe 2009-11-30 02:01:34

+0

請參閱'man bash':-e檢查文件是否存在,-f檢查它是否也是文件(不是目錄) – 2009-11-30 02:13:09

1

使用getopts解析選項,然後把餘下的非選項參數,只要你喜歡(如通過測試,如果他們的文件)。

0

如果您在不帶引號的情況下搜索「模式匹配」,則可以在bash手冊頁中找到相關信息。這個技巧:[a-zA-Z0-9] *) 您應該閱讀關於模式匹配,正則表達式等等。此外,您應該尊重John Kugelmans對雙引號的暗示。 在以下代碼片段中,您可以看到如何檢查是否沒有參數傳遞。

#!/bin/sh 

case "$1" in 
    [a-zA-Z0-9]*) 
     echo "filename" 
    ;; 
    "") 
     echo "no data" 
    ;; 

esac 
0

@OP,總的來說,如果你正在使用bash,匹配不區分大小寫,您可以使用禁用了javascript,並設置nocasematch

$ shopt -s nocasematch 

在你的case語句來檢查空

case "$var" in 
    "") echo "empty value";; 
esac 
0

你最好是落入默認情況下*),並且您至少可以檢查文件是否存在[-e「$ 1」] ...如果不存在,則回顯用法並退出1.