如何在bash中制作* ='*'?

时间:2012-04-05 17:16:47

标签: bash

我是bash脚本的新手,有以下问题: 我正在尝试创建一个搜索脚本,让我搜索包含带有find和/或grep以及可选参数的特定字符串的文件,并且我遇到了最后一个问题,*字符与中的条件不匹配所有情况。

我的脚本有3个参数:

  • string_to_search(必填)
  • file_name_pattern(可选)
  • 路径(可选)

示例:

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

我想得到以下内容:

  • 如果未指定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" == \* ];

这样在将这些值作为参数传递给命令行时,*应该被视为'*'?

当我们只将没有引号的*传递给脚本时,即使用\ *转义*,条件也不匹配。

换句话说,我想将*视为普通的通配符,就像在任何其他命令中一样,所以* ='*'

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

在bash中编写*时,它在当前目录中被解释为文件匹配。因此,您的脚本实际上是使用./search_text.sh 'string_to_search' a.txt b.txt调用的(假设当前的物品中只有两个文件,名为“a.txt”和“b.txt”)。因为'a.txt'不是'*',所以执行查找代码。我所知道的唯一阻止它的方法是将其放入撇号(')中 - 就像你所做的那样 - 或者用反斜杠('\')将其转义

答案 1 :(得分:3)

您可以使用

禁用所有glob扩展
 set -o noglob

之后*并不特别:

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

但是,在调用脚本之前,无法强制用户执行此操作。由于用户的shell,而不是你的脚本,控制通配,你没有任何追索权。

你唯一的选择是治疗

./search_text.sh 'string_to_search' *

完全像

./search_text.sh 'string_to_search' file1 file2

因为无论如何都是这样。

换句话说,如果没有指定尾随目录且$1不是文字*,请使用grep案例。