2

変数に文字列があり、それを別の文字列に置き換えたいのですが、一致する文字列にバックスラッシュが含まれている場合、操作は効果がありません。

これは、機能しないスクリプトの一部です。

cpuQueueOutput=`/usr/local/nagios/libexec/check_nrpe -H $hostname -t 30 -c Check_Pdh -a 'counter=\System\Processor Queue Length'`
echo "CPU Queue1: $cpuQueueOutput"
matchCpuQueueOutput="\System\Processor"
newCpuQueueOutput="CPU Queue"
CpuQueuePerf=`echo ${cpuQueueOutput//$matchCpuQueueOutput/$newCpuQueueOutput}`
echo "CPU Queue2: $CpuQueuePerf"

スクリプトからの出力は次のようになります。

CPU Queue1: OK: |'\System\Processor Queue Length_value'=0;0;0
CPU Queue2: OK: |'\System\Processor Queue Length_value'=0;0;0
OK: CPU Stats {(total, avg 1m: 9%), (total, avg 5m: 3%)} Top 3 Processes: {(powershell : 64%), (svchost#3 : 0%), (svchost#2 : 0%)} | 'total 1m'=9%;90;95 'total 5m'=3%;90;95

で置き換える置換は機能OK: |'\System\Processor Queue Length_value''CPU Queue'ません。

4

1 に答える 1

2

より多くの引用符を使用してください!

# $'' makes the shell interpret backslashes, for easier embedding of single quotes
# inside a single-quoted string.
s=$'|\'\\System\\Processor Queue Length_value\'=0;0;0'
match="\System\Processor"
replace="CPU Queue"
echo "${s//"$match"/$replace}" # ignore StackOverflow's incorrect syntax highlighting

...とは対照的に...

echo "${s//$match/$replace}"

これが機能するのは、bash のパターン マッチ コンテキストで展開を引用すると、その展開の結果がリテラルになるためです。

于 2015-01-28T15:41:07.387 に答える