无法在 for 循环内使用 linux 中具有 space 的值进行 grep

Unable to grep with value having space in linux inside a for loop

我已经声明了一个数组

declare -a kernel_parms=("'kernel.shmmax ':4294967295:IBM" "'kernel.shmseg ':2048:AT" "'kernel.shmmni ':2048:BT" "'kernel.sem ':1024:IBM" "'kernel.semaem ':16384:IBM" "'kernel.semvmx ':32767:IBM" "'kernel.semmap ':1026:AT" "'kernel.semmnu ':16384:IBM" "'kernel.semume ':256:IBM" "'kernel.msgmni ':50:AT" "'kernel.msgmap ':1024:BT" "'kernel.msgmax ':4096:AT" "'kernel.msgmnb ':4096:AT")

我是 运行 linux

中的一个 for 循环
for ((i=0;i< ${#kernel_parms[@]};i++)); 
do  
    echo "Param is" + "${kernel_parms[$i]}"
    parm=`echo "${kernel_parms[$i]}" | gawk -F: '{print }'`
    echo "${kernel_parms[$i]}"
    echo $parm
    sysctl -a | grep -i "$parm"
done

对于数组 parm 中的第一个条目是 'kernel.shmmax ' 但 grep 不会 return for 循环内的任何结果但是如果我独立执行 grep 那么我会得到结果

# sysctl -a | grep -i 'kernel.shmmax '
  kernel.shmmax = 18446744073692774399

for循环的输出是

Param is + 'kernel.shmmax ':4294967295:IBM
'kernel.shmmax ':4294967295:IBM
'kernel.shmmax '
Param is + 'kernel.shmseg ':2048:AT
'kernel.shmseg ':2048:AT
'kernel.shmseg '
Param is + 'kernel.shmmni ':2048:BT
'kernel.shmmni ':2048:BT
'kernel.shmmni '
Param is + 'kernel.sem ':1024:IBM
'kernel.sem ':1024:IBM
'kernel.sem '
Param is + 'kernel.semaem ':16384:IBM
'kernel.semaem ':16384:IBM
'kernel.semaem '
Param is + 'kernel.semvmx ':32767:IBM
'kernel.semvmx ':32767:IBM
'kernel.semvmx '
Param is + 'kernel.semmap ':1026:AT
'kernel.semmap ':1026:AT
'kernel.semmap '
Param is + 'kernel.semmnu ':16384:IBM
'kernel.semmnu ':16384:IBM
'kernel.semmnu '
Param is + 'kernel.semume ':256:IBM
'kernel.semume ':256:IBM
'kernel.semume '
Param is + 'kernel.msgmni ':50:AT
'kernel.msgmni ':50:AT
'kernel.msgmni '
Param is + 'kernel.msgmap ':1024:BT
'kernel.msgmap ':1024:BT
'kernel.msgmap '
Param is + 'kernel.msgmax ':4096:AT
'kernel.msgmax ':4096:AT
'kernel.msgmax '
Param is + 'kernel.msgmnb ':4096:AT
'kernel.msgmnb ':4096:AT
'kernel.msgmnb '

为什么 grep 没有 return在 for 循环中进行任何匹配?感谢任何帮助。

谢谢, 萨加尔

strip the last and first character from a String

使用上面的答案,我正在删除变量的第一个和最后一个字符,它们是命令中的引号及其现在显示的结果

for循环内部修改为

sysctl -a | grep -i "${parm:1:-1}";

来自

sysctl -a | grep -i "$parm"; 

而且效果很好