我有一个 bash 脚本,它只是 grep 命令的快捷方式。我这样称呼它:
stx -p /var/www -t 'my text'
这将运行这个命令:
sudo grep -rinI /var/www -e 'my text'
我正在尝试添加包含或排除具有特定扩展名(.css、.js 等)的文件的功能。这是脚本:
#!/usr/bin/bash
#search for text in files
set -x #echo all commands
while [ -n "$1" ]; do
case "$1" in
-p) path="$2" # path to start search in
shift
;;
-t) txt="$2" # text to search for
shift
;;
-i) inc="$2"
#echo 'inc: ' $inc
include="--include=\*.${inc}" # file type to include
shift
;;
-?)
echo 'stx usage:'
echo '-p path to search in'
echo '-t text to search for'
exit 0
shift
;;
esac
shift
done
result=$(sudo grep -rinI $include "$path" -e "$txt")
echo "$result"
# grep options:
# r recursive
# i case-insensitive
# n show line number
# I ignore binary files
# --include only include files with specified extension
当我运行此命令时,由于某种原因,它会在 $include 变量周围添加单引号,因此如果我尝试运行此命令来搜索 .js 文件中的“我的文本”:
stx -p /var/www -t 'my text' -i js
它产生这个:
sudo grep -rinI '--include=\*.js' /var/www -e 'my text'
--include*.js 周围的单引号破坏了它。我怎样才能阻止它插入这些引号?
答案1
正如 muru 指出的那样,这是由此处使用的反斜杠转义引起的:
-i) inc="$2"
#echo 'inc: ' $inc
include="--include=\*.${inc}" # file type to include
通配符*
才不是在双引号内展开,这意味着它已经被转义(通过引号),这意味着反斜杠转义也将按字面意思处理。
你可以将其更改为:
-i) include="--include=*.${2}";;
在这里您可以看到在各种情况下如何处理反斜杠转义:
$ echo \*
*
$ echo "\*"
\*
$ echo "\$"
$
在第一个示例中,它在转义后被删除*
在第二个示例中,不需要转义 the,*
因此它按字面意思保留
在第三个示例中,需要转义$
(其中能在单引号内展开),因此将其删除。