我是bash脚本的新手,有以下问题: 我正在尝试创建一个搜索脚本,让我搜索包含带有find和/或grep以及可选参数的特定字符串的文件,并且我遇到了最后一个问题,*字符与中的条件不匹配所有情况。
我的脚本有3个参数:
示例:
./search_text.sh 'string_to_search' 'file_name_pattern' /path
我想得到以下内容:
这是我的代码:
#!/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 :(得分: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
案例。