私はDebian 10を使用しています。私はしばしばテキストを検索するためにコマンドを実行します。
sudo grep -rin <path> -e <text to search for>
私はこのコマンドをたくさん使うので、いくつかを自動化し、次のように呼び出す簡単なスクリプトを作成したいと思いました。
stx -p <path> -t <text to search for>
したがって、次のように呼び出すことができます。
stx -p /var/www -t 'navbar ul'
stx -p ~/.wine/drive_c/Program\ Files -t 'asdf ghjk'
パスと検索テキストにスペースを含めることができます。これにより、引用符やエスケープを処理する方法に関する質問が発生します。スクリプト:
#!/usr/bin/bash
#search text
while [ -n "$1" ]; do
case "$1" in
-p) path="$2" # path to start search in
shift
;;
-t) txt="$2" # text to search for
shift
;;
esac
shift
done
echo sudo grep -rin $path -e \'$txt\'
#exit 0
sudo grep -rin $path -e '$txt'
# grep options:
# r recursive
# i case-insensitive
# n show line number
エコではコマンドが正しいようです。ただし、このコマンドを実行すると、パスとテキスト部分に異なる問題が発生します。パス部分はスペースを含むファイル名では機能しないようで、テキスト部分は各単語を個別に検索するようです。
答え1
問題は二重引用符で囲まれた変数にはありません。
シェルから正しく引用する方法を学ぶことは非常に重要です。
スペース/メタ文字を含むすべてのリテラルは「二重引用符」として扱われます。すべて拡張:
"$var"
、、、、。"$(command "$var")"
コードまたはテキストの場合。"${array[@]}"
"a & b"
'single quotes'
$'s: 'Costs $5 US'
ssh host 'echo "$HOSTNAME"'
バラより
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words