字符串数组如何在 bash 脚本中工作?

How to does a string array work in bash script?

我是脚本新手,我想监控内存使用率最高的前 2 个进程,并保留非 mysqld 进程的列表。

我在下面写了一个脚本,

lines=$(ps aux --sort rss | head -n 3)
echo $lines
for line in $lines
do
    echo $line
done

并发现它打印的是单词而不是行。

如何在可变行中保存一行?

您根本没有创建数组。语法看起来像

lines=($(ps aux --sort rss | head -n 3))

其中内部 $(...) 是一个命令替换,它简单地扩展为一个标记序列(不是行!),外部括号声明一个数组。

可能更好的解决方案是直接循环 ps 的输出。仅当您出于某种原因需要重复遍历值时(例如按不同标准对它们进行排序,或多次循环遍历它们),将结果收集到数组中才有用。

ps aux --sort rss | head -n 3

或者如果你想进一步装饰输出,也许

ps aux --sort rss | head -n 3 |
while IFS= read -r line; do
    echo "the output was $line with proper quoting"
done

(虽然在值周围有静态修饰,也许更喜欢 ps aux --sort rss | head -n 3 | sed 's/.*/the output was & with some decorations/')。

使用 Bash 的最新版本,您可以使用 readarray -t.

将值读入数组
readarray -t lines < <(ps aux --sort rss | head -n 3)
for line in "${lines[@]}"; do  # notice proper array syntax
   echo "$line"                # notice proper quoting
done

数组语法有点奇怪,但需要 backwards-compatible 与原始 Bourne shell,其中 $lines 将始终引用单个字符串值。

readarray 是 Bash v4+,因此目前不可用,例如在 MacOS 上开箱即用。)