私はFreeBSDを使用します
> uname -sr
FreeBSD 6.3-RELEASE
私が照会するとき
> grep `whoami` /etc/passwd
私が望む情報が表示されます。
しかし、tcshスクリプトに入れようとすると、次のようになります。
#!/bin/tcsh
set login = `whoami`
echo $login
set query = `grep $login /etc/passwd`
echo $query
これは私に次のことを与えます:
dolg_gr
echo: No match.
なぜ「一致しない」? $query変数のコマンドシェルで提供される文字列をどのように取得しますか?
答え1
それは問題ではありませんgrep
。引用符で囲まれていない変数の拡張に問題があります。
echo $query
grep
そして返された一致する行にワイルドカード文字が含まれているという事実*
。でtcsh
失敗したglobのデフォルトの動作はbashのfailglob
オプションと似ています。エラーはglobがないことを知らせます。ファイル名の一致パスワード文字列の場合:
$ tcsh -c 'echo dol_gr:*:3291'
echo: No match.
ステファン・チャゼラスが述べたように、(t)cshで変数の拡張を参照する正しい方法はmodifiersを使用することですq
。また、引用しない場合はSPC、TAB、およびNLで分割が発生しtcsh
ますが、引用されている場合はNLでのみ発生します。`...`
set query = "`grep $login:q /etc/passwd`"
echo $query:q