bashスクリプトのコマンドラインからコマンドに渡された引用符をエスケープする方法

bashスクリプトのコマンドラインからコマンドに渡された引用符をエスケープする方法

私は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

おすすめ記事