質問: ### Linuxでgrepの正規表現を利用中に引数$1を渡す方法についてご教授下さい いつもお世話になっています。 現在、Linuxで動作するシェルスクリプトを作成しております。 当シェルスクリプトですが、タブを含むtsvテキストファイルに含まれるキーワードに対してgrepの正規表現で抽出したいと考えております。 その際にキーワードはシェルに引数で渡したいと考えております。 grepの正規表現内に引数「$1」を利用したいのですが、正規表現の行末を表す「$」と認識されており正しく機能しておりません。 シェルスクリプトの内容を以下に掲載しますので、 どなたか詳しい方、ご教授いただけますでしょうか。よろしくお願いします。 ### 発生している問題 ``` grep でキーワードを抽出したいが引数「$1」の「$」部分が正規表現の行末を表す「$」と同じようで正しく抽出されておりません ``` ### 該当のソースコード 以下、作ったシェルスクリプトです (説明のため簡略化してあります) タブ区切りで4つの単語が並んでおり、2つ目の単語のキーワード(数字)を引数で渡したいと考えております。 実行パターン1 sh test.sh 実行パターン2 sh test.sh キーワード(数字) ``` test.sh 引数 $1 パターン1(引数なしでキーワードを直接入力) cat test.tsv | grep $'^[^\t]*\t[キーワード]*\t[^\t]*\t[^\t]*' パターン2(引数で渡す) cat test.tsv | grep $'^[^\t]*\t[$1]*\t[^\t]*\t[^\t]*' ``` ### 試したこと 上記のパターン1ですと、直接入力しているので抽出可能です。 上記のパターン2ですと「$」部分が末尾として認識されているようで抽出が出来ておりません。 ### 実現したいこと 上記パターン2の引数を渡す形で実現したいのですが私の技術力が乏しく、引数の適切な渡し方が分かっておりません。
回答: シングルコーテーションで囲った中では変数は展開されないのでダブルコーテーションで囲うか、文字列をいったん終了してください。 `cat test.tsv | grep $"^[^\t]*\t[$1]*\t[^\t]*\t[^\t]*"`や `cat test.tsv | grep $'^[^\t]*\t['$1']*\t[^\t]*\t[^\t]*"`や などです。 スクリプト実行時に`-x`をつけておくとどう展開されているか観測できます。 `bash -x test.sh`