我有一个 bash 脚本,它只是 grep 命令的快捷方式。我这样称呼它:
stx -p /var/www -t 'my text'
Run Code Online (Sandbox Code Playgroud)
这将运行此命令:
sudo grep -rinI /var/www -e 'my text'
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加包含或排除具有特定扩展名(.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
Run Code Online (Sandbox Code Playgroud)
当我运行它时,出于某种原因,它在 $include 变量周围放置了单引号,因此如果我尝试运行它以在 .js 文件中搜索“我的文本”:
stx -p /var/www -t 'my text' -i js
Run Code Online (Sandbox Code Playgroud)
它产生这个:
sudo grep -rinI '--include=\*.js' /var/www -e 'my text'
Run Code Online (Sandbox Code Playgroud)
--include*.js 周围的单引号破坏了它。我怎样才能阻止它插入这些引号?
正如穆鲁指出的那样,这是由此处使用的反斜杠转义引起的:
-i) inc="$2"
#echo 'inc: ' $inc
include="--include=\*.${inc}" # file type to include
Run Code Online (Sandbox Code Playgroud)
该*
通配符不扩大内需双引号,这意味着它已经被转义(用引号),这意味着反斜杠转义将字面上对待为好。
您可以将其更改为:
-i) include="--include=*.${2}";;
Run Code Online (Sandbox Code Playgroud)
在这里您可以看到在各种情况下如何处理反斜杠转义:
$ echo \*
*
$ echo "\*"
\*
$ echo "\$"
$
Run Code Online (Sandbox Code Playgroud)
在第一个示例中,它在转义后被删除*
在第二个示例中,它不需要转义,*
所以它是字面保留
在第三个示例中,需要转义 the $
(可以在单引号内展开),因此它被删除。