質問: お世話になります。 シェル変数に * (アスタリスク)を設定する方法について質問させてください。 CentOS6.9のシェル(bash)ですが、シェル変数に設定する値が * または ? の場合 (1)カレントディレクトリで「ls *」または「ls ?」に該当するファイルが存在すればその一覧 (2)存在しなければ * または ? が設定されます。 例えばコマンドで test_var='*';echo ${test_var} を実行したときの結果ですが、 (a)コマンド実行時のカレントディレクトリにファイルが存在する時はファイルリストが表示される。 (b)コマンド実行時のカレントディレクトリにファイルが存在しない時は * が表示される。 という結果が得られます。 シェル変数に設定する値が * または ? の場合、カレントディレクトリの状況にかかわらず、常に * または ? を設定するにはどうすれば良いでしょうか? 実は現在、シェルを開発中なのですが、これが原因で困っています。 開発中のシェルは「シェルの動作結果として出力するファイル名」を「シェルが参照するconfファイル内に指定されたファイル名」で決定するようにしています。 またシェルは「confファイル内で指定されたファイル名」に「Windowsのファイル名で指定できない文字が含まれないことのチェック機能」も実装しています。 このチェック機能は「Windowsのファイル名で指定できない文字」を「シェル内部の配列変数」に定義し、それを grep コマンドでチェックしようとしています。 echo ${出力ファイル名を設定した変数}|grep -F ${ファイル名で指定できない文字を設定した配列変数} 具体的には上記イメージのgrepチェック処理を「ファイル名で指定できない文字を設定した配列変数」の件数分ループしてチェックするイメージで、grepコマンドでは -F オプションを用い、正規表現ではなく、単純な文字としてのチェックで実装しようとしています。(私は正規表現があまり得意ではなく、またプロジェクトの方針も「正規表現は極力使用しない」というものです。)ところが * のチェックが不安定で、調査したところ、上記事象が判明した次第です。 とりあえず * および ? は配列変数を用いず、直接 grep -F '*' grep -F '?' でチェックするようにしたのですが、何らかの方法で配列変数に * および ? を 「grep -F で指定できる形式」で設定できればと考えています。 以上よろしくお願いします。
回答: いろいろ方法があります。 まず、Bashで`*` `?`の展開を抑止するのは、`set -f`すればいいです。 ``` set -f echo * #=>展開されない ``` 普通は、二重引用符で囲みます。 ``` FOO="*" echo ${FOO} #=>展開される echo "${FOO}" #=>展開されない ``` そもそも、「Windowsのファイル名で指定できない文字が含まれないことのチェック」であれば、直接書いた方が良いです。 ``` FOO="ファイル名" if echo "${FOO}" | grep '[\/:*?"<>|]' >/dev/null then echo 使えません fi ```