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番目の例では、エスケープする*
必要はないので、*
文字通り保持されます(ここでは)。$
できる一重引用符で展開されているので削除してください。