2013-07-10 70 views
46

我有一個Bash腳本根據變量的值執行操作。 case語句的一般語法是:如何測試Bash case語句中的空字符串?

case ${command} in 
    start) do_start ;; 
    stop) do_stop ;; 
    config) do_config ;; 
    *)  do_help ;; 
esac 

我想如果沒有提供命令執行默認程序,並do_help如果命令是無法識別的。我試着從而省略的情況下值:

case ${command} in 
    )  do_default ;; 
    ... 
    *)  do_help ;; 
esac 

結果是可以預見的,我想:

syntax error near unexpected token `)' 

然後我試着用我最好的拍攝在正則表達式:

case ${command} in 
    ^$)  do_default ;; 
    ... 
    *)  do_help ;; 
esac 

有了這個,一個空的$ {命令}落入*情況。

我想要做不可能的事情嗎?

+0

如何提供命令?通過stdin? – Oak

回答

77

case聲明使用球體而不是正則表達式,並堅持精確匹配。

所以空字符串寫入,像往常一樣,爲""''

case "$command" in 
    "")  do_empty ;; 
    something) do_something ;; 
    prefix*) do_prefix ;; 
    *)   do_other ;; 
esac 
4

這裏有一個解決方法:

case _${command} in 
    _start) do_start ;; 
    _stop) do_stop ;; 
    _config) do_config ;; 
    _)  do_default ;; 
    *)  do_help ;; 
esac 

很明顯,你可以使用任何你喜歡的前綴。

1

我使用通過一個簡單的下跌。沒有參數傳遞($ 1 =「」)將被第二個case語句捕獲,但以下*將捕獲任何未知參數。翻轉「」)和*)將不起作用,因爲*)會在這種情況下每次都捕獲所有內容,甚至是空白。

#!/usr/local/bin/bash 
# testcase.sh 
case "$1" in 
    abc) 
    echo "this $1 word was seen." 
    ;; 
    "") 
    echo "no $1 word at all was seen." 
    ;; 
    *) 
    echo "any $1 word was seen." 
    ;; 
esac 
0

這裏是我如何做到這一點(每一個自己):

#!/bin/sh 

echo -en "Enter string: " 
read string 
> finder.txt 
echo "--" >> finder.txt 

for file in `find . -name '*cgi'` 

do 

x=`grep -i -e "$string" $file` 

case $x in 
"") 
    echo "Skipping $file"; 
;; 
*) 
    echo "$file: " >> finder.txt 
    echo "$x" >> finder.txt 
    echo "--" >> finder.txt 
;; 
esac 

done 

more finder.txt 

如果我正在尋找存在於一個或兩個文件中含有幾十種CGI文件我進入一個文件系統的子程序搜索詞,例如'ssn_format'。慶典讓我回來,看起來像這樣的文本文件(finder.txt)結果:

- ./registry/master_person_index.cgi: SQLClinic ::安全:: ssn_format($用戶,$ SCRIPT_NAME, $ local,$ Local,$ ssn)if $ ssn ne「」;

相關問題