Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String bash中的字符串替换(${s//$foo/$bar})不能使用反斜杠_String_Bash_Scripting_String Substitution - Fatal编程技术网

String bash中的字符串替换(${s//$foo/$bar})不能使用反斜杠

String bash中的字符串替换(${s//$foo/$bar})不能使用反斜杠,string,bash,scripting,string-substitution,String,Bash,Scripting,String Substitution,变量中有一个字符串,我想用另一个字符串替换它,但当匹配的字符串包含反斜杠时,该操作无效 这是脚本中不起作用的部分: 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="\Syste

变量中有一个字符串,我想用另一个字符串替换它,但当匹配的字符串包含反斜杠时,该操作无效

这是脚本中不起作用的部分:

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
'CPU Queue'
替换
OK:|'\System\Processor Queue Length\u value'
无效。

请使用更多引号

# $'' 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中的模式匹配上下文中引用扩展会使扩展的结果变成文字,而反斜杠需要被视为文字来匹配它们自己。

您的“完整脚本”似乎在前几行的窗口长度处被截断了。为什么需要
回显
EVALSTRING=${CPUOUTPUT//$MATCHEVALSTRING/$NEWEVALSTRING}
有什么问题吗?问题在这部分:CPUQUEUEOUTPUT=
/usr/local/nagios/libexec/check\nrpe-H$HOSTNAME-t30-c check\Pdh-a'counter=\System\Pr$echo“CPU队列1:$CPUQUEUEOUTPUT”MATCHCPUQUEUEOUTPUT=“Processor”NEWCPUQUEUEOUTPUT=“CPU队列”CPUQUEUEPERF=
echo${CPUQUEUEOUTPUT//$matchcpuqueueoutput/$NEWCPUQUEUEOUTPUT}`echo“CPU Queue2:$CPUQUEUEPERF”EVALSTRING=${cpuuoutput/$MATCHEVALSTRING/$NEWEVALSTRING}工作正常CPUQUEUEPERF=
echo${CPUQUEUEOUTPUT/$matchcpuqueueoutput/$NEWCPUQUEUEOUTPUT}
没有work@user2961029:对于bash变量名使用ALLCAPS是一种很好的方式,这是一个常见的误解。这不是好的风格。所有caps变量都由操作系统和shell使用。您应该只使用普通名称(带大小写或下划线),以使变量名可读。(
match\u cpu\u queue\u output
)例如,这似乎有效!谢谢你,查尔斯。下次我会记得做一个示例代码。谢谢你的提示。