私は次のようなスクリプトを書いた。
srvc_location=`ps -ef| grep '${sandbox}.*pset' | head 1 | awk {print $9}`
echo "SERVICE LOC : "$srvc_location
しかし、奇妙なことは、$srvc_location
ほとんどの場合問題を解決しますが、時には次のメッセージで解決しないことです。
SERVICE LOC : strrosdev_silo1_int.*pset
追加情報:
上記のコードはループで実行されるため、
$sandbox
毎回新しい値が生成されます。試してみました
grep -e "${sandbox}.*pset
が、問題は解決されませんでした。grep
2つを使用すると問題を解決できますが、grep $sandbox |grep pset
パターンには1つだけを使用したいと思います。
なぜこれですか?
ベストアンサー1
コードが失敗する理由の1つは、変数の周りの式に二重引用符の'...'
代わりに一重引用符を使用するためです。"..."
grep
代わりにこれを使用してください
srvc_location=$(ps -ef| grep "${sandbox}.*pset" | head -1 | awk '{print $9}')
echo "SERVICE LOC : $srvc_location"
実際、次のように組み合わせる必要はほとんどありません。なぜなら、head
次のようにできるからです。awk
awk
srvc_location=$(ps -ef| grep "$sandbox.*pset" | awk '{print $9; exit}')
これもあまり明確ではありませんが、grep
ここに含まれています。
srvc_location=$(ps -ef| awk -v sb="$sandbox" 'BEGIN { re = sb ".*pset" } $0 ~ re { print $9; exit}')
ここに私たちが使用するいくつかの機能がありますawk
。シェル変数の値をとるawk
変数を定義します。このブロックは、一致する必要があるパターンを含む変数を定義し、スクリプトの残りの部分は変数の正規表現と一致し、必須フィールドを印刷して完了するとすぐに終了します。sb
$sandbox
BEGIN
awk
awk
re