我对以下代码的期望是我将拥有两个共享内存ID数组。一个列出ID为零附件的ID,另一个列出ID多于零的附件。
我正在解析的命令输出是:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x6c020df2 131072 monitor 600 4276656 6
0x77020d34 4620289 usera 666 104 0
0x78020d34 4653058 usera 666 651328000 0
0x72020d34 4685827 usera 666 15808 0
代码如下:
free_shmids=()
used_shmids=()
IFS=$'\n'
for line in $(sudo ipcs -m | grep '0x'); do
nattch=$(echo $line | awk '{ print $NF; }')
shmid=$(echo $line | awk '{ print $2; }')
if [ $nattch -eq "0" ]; then
free_shmids+=($shmid)
else
used_shmids+=($shmid)
fi
done
unset -v IFS
相反,免费ID列表只是三个可用的第一个免费ID。我这里只有一个使用过的共享内存段,所以我认为即使我无法证明它也会失败。
作为参考,我正在运行bash 4.3.11,所以我很确定我可以访问数组的+=
语法。
编辑:
要迭代自由ID数组,我这样做:
for id in $free_shmids; do
echo $id
done
当然,我打算在for循环体中做一些更复杂的事情,但是这种精确的迭代方法并没有列出数组的每个元素。
答案 0 :(得分:2)
我打赌你这样做了:
echo $free_shmid
由于这是一个数组,因此您没有使用正确的语法。在不指定索引的情况下取消引用数组只会为您提供数组中的第一个元素。做这样的事情:
printf "free: %s\n" "${free_shmid[@]}"
printf "used: %s\n" "${used_shmid[@]}"
使用while read
循环通常比使用for
循环读取输入行更受欢迎。例如
#!/bin/bash
data="------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x6c020df2 131072 monitor 600 4276656 6
0x77020d34 4620289 usera 666 104 0
0x78020d34 4653058 usera 666 651328000 0
0x72020d34 4685827 usera 666 15808 0 "
echo "$data" | {
read title # first line
read header # second line
# now read and process the rest
while read -r key shmid owner perms bytes nattch status; do
if ((nattch == 0)); then
free_shmid+=($shmid)
else
used_shmid+=($shmid)
fi
done
printf "free: %s\n" "${free_shmid[@]}"
printf "used: %s\n" "${used_shmid[@]}"
}
输出
free: 4620289
free: 4653058
free: 4685827
used: 131072
要迭代数组的元素,必须执行此操作:
for elem in "${array[@]}"; do ...
是的,绝对需要所有引号和其他字符。