防止 bash 脚本中出现单引号

防止 bash 脚本中出现单引号

我有一个 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,*因此它按字面意思保留
在第三个示例中,需要转义$(其中在单引号内展开),因此将其删除。

相关内容