Bashスクリプトに一重引用符が表示されないようにする

Bashスクリプトに一重引用符が表示されないようにする

grepコマンドのショートカットであるbashスクリプトがあります。私はそれをそう呼ぶ:

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 "\$"
$

最初の例では、エスケープ後に削除されます。 2番目の例では、エスケープする*
必要はないので、*文字通り保持されます(ここでは)。
$できる一重引用符で展開されているので削除してください。

おすすめ記事