字符串数组如何在 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 上开箱即用。)
我是脚本新手,我想监控内存使用率最高的前 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 上开箱即用。)