このようなシナリオがあります。
VAR = `Some command brings the file path name and assigns it to VAR`
たとえば、VAR は /root/user/samp.txt などの値を持つことができます。
grepコマンドが欲しい
grep HI $VAR
これはうまくいきません。 /root/user/samp.txt を開くことができないというエラーが発生します。 cat $ VARを試みると同じエラーが発生します。
この問題をどのように処理しますか?
私は試した
echo $VAR | grep HI
grep HI "$VAR"
コーンシェルの使用
答え1
grepをリクエストしたことを知っていますが、私が正しく理解している場合は、パス文字列から部分文字列を検索したいと思います。 just==
または=~
likeを使用してこれを達成できます。
[[ "$VAR" == *"HI"* ]] # Does "$VAR" match <stuff>HI<stuff>?
または
[[ "$VAR" =~ "HI" ]] # Does "$VAR" contain HI?
答え2
コマンドにファイルパスが割り当てられた変数があります。
例えば
VAR = grep /adr filename
- 私のファイル名に次の行があるとします。/adr/samp.txt
したがって、$ VARをechoすると/adr/samp.txtが表示されますが、cat $ VARまたはgrepではエラーが発生します。
VAR=$(grep /adr filename) を設定してこの問題を解決しました。その後、cat $ VARを実行できます。
何が問題なのかわかりません。
ありがとう、アデル
答え3
WAFの[[ "$VAR" =~ "HI" ]]
答え以下はあなたが探している素晴らしいソリューションですbash
。ただし、移植可能なソリューションを探している人がいる場合は、ksh
通常のPOSIXシェル(basic)/bin/sh
でローカルに実行する方法は次のとおりです。
[ "$VAR" != "${VAR#*HI}" ]
気をつけて、シェルモード構文(別名「ワイルドカード」)その他POSIX正規表現構文から派生しました。
これは、引数拡張の値を比較することで、次のことを達成し$VAR
ます。${VAR#*HI}
部分文字列の削除"HI"の先頭と最初のインスタンスの間のすべてのエントリを削除します(与えられた場合、VAR="OHIO"
先行${VAR#*HI}
は削除され、.OHI
の結果は変更されません)。O
VAR="Hi, I am bob"
!=
比較のため、戻り値は次のようになります。本物(0
)2つの文字列が異なる場合(表現に「HI」が存在する$VAR
)と間違った(1
)が同じ場合(「HI」は表現に存在しません$VAR
)。