gpt4 book ai didi

linux - 向 bash 数组添加值

转载 作者:太空宇宙 更新时间:2023-11-04 09:22:49 24 4
gpt4 key购买 nike

我对以下代码的期望是我将有两个共享内存 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 中的第一个免费 ID。我这里只有一个使用过的共享内存段,所以我假设它以同样的方式失败,尽管我无法证明这一点。

作为引用,我正在运行 bash 4.3.11,所以我很确定我可以访问数组的 += 语法。

编辑:

为了迭代免费 ID 数组,我正在这样做:

for id in $free_shmids; do
echo $id
done

当然,我打算在 for 循环体中做一些更复杂的事情,但是这种确切的迭代方法并没有列出数组的每个元素。

最佳答案

我打赌你正在这样做:

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 ...

是的,所有引号和其他字符都是必需的。

关于linux - 向 bash 数组添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40033047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com