2012-04-05 50 views
1

我是bash腳本中的新手,並且存在以下問題: 我試圖製作一個搜索腳本,讓我搜索包含find和/或grep和可選參數的特定字符串的文件,而且我卡住最後一個問題,在所有情況下,*字符與條件不匹配。如何在bash中使* ='*'?

有3個參數,以我的腳本:

  • string_to_search(必需)
  • file_name_pattern(可選)
  • 路徑(可選)

實施例:

./search_text.sh 'string_to_search' 'file_name_pattern' /path 

我想要ge T中的以下內容:

  • 如果未指定file_name_pattern或*(帶或不帶引號)=> grep的
  • 如果file_name_pattern什麼事情比別的*或 '*'=>找到+用grep

這裏是我的代碼:

#!/bin/bash 

# ------------------------------------ 
# Set default values for optional parameters (tests) 

if [ ! -z $2 ] 
then 
    FILE_TYPE=$2 
    echo 'FILE_TYPE : var 2' 
else 
    FILE_TYPE="*" 
    echo 'FILE_TYPE : *' 
fi 

if [ ! -z $3 ] 
then 
    LOCATION=$3 
    echo 'LOCATION : var 3' 
else 
    LOCATION=. 
    echo 'LOCATION : .' 
fi 

# ------------------------------------ 
# Do search/show conditions 

if [ "$FILE_TYPE" == \* ]; 
    then 
    #grep -rn -C 0 --color=always "$1" $LOCATION | less -R; 
    echo ' => GREP'; 
    else 
    #find $LOCATION -iname $FILE_TYPE | sort | xargs grep "$1" --color=always -n 2>/dev/null | less -R; 
    echo '=> FIND'; 
fi 

只要運行該代碼在年底進行測試,以顯示2個回聲。

現在我的問題是:

./search_text.sh 'string_to_search' '*.php' /path => works (FIND) 
./search_text.sh 'string_to_search' '*' /path  => works (GREP) 
./search_text.sh 'string_to_search' '*'   => works (GREP) 
./search_text.sh 'string_to_search' *    => ERROR => goes to FIND INSTEAD OF GREP :-(
./search_text.sh 'string_to_search'    => works (GREP) 

換句話說,我怎麼能寫出下列條件:

if [ "$FILE_TYPE" == \* ]; 

使*應被路過的時候認爲是同爲「*」這些值作爲命令行中的參數?

即使使用\ *轉義*,當我們僅將*不帶引號傳遞給腳本時,條件不匹配。

換句話說,我想使*被視爲像任何其他命令正常的通配符,所以* =「*」

任何幫助,非常感謝!

+0

感謝Attila和Sorpigal ;-)好吧,我認爲有一種簡單的方法來逃避* char並將其當作一個字符串處理,但是我會將它用於引號,再次感謝您的幫助 – user1186503 2012-04-05 21:43:23

回答

3

您可以禁用使用

所有水珠擴張
set -o noglob 

之後*不是特別:

$ ls * 
ls: *: No such file or directory 

但是,有沒有辦法強制用戶在調用腳本之前做到這一點。由於用戶的shell,而不是你的腳本,控制globbing你沒有追索權。

你唯一的選擇是治療

./search_text.sh 'string_to_search' * 

酷似

./search_text.sh 'string_to_search' file1 file2 

自那它是什麼呢。

換句話說,當沒有指定尾隨目錄並且$1不是文字*時,請使用grep的情況。

4

當您在bash中編寫*時,它在當前目錄中被解釋爲文件匹配。因此,您的腳本實際上是使用./search_text.sh 'string_to_search' a.txt b.txt(假設當前dirtectory中只有兩個文件,名爲'a.txt'和'b.txt')調用的。因爲'a.txt'不是'*',所以你的查找代碼被執行。我所知道的唯一方法,以防止它在apostophes附上(') - 像你一樣 - 或者用反斜槓(「\」)轉義