代码之家  ›  专栏  ›  技术社区  ›  FlashAgain

如何在bash脚本中使用字符串数组?

  •  0
  • FlashAgain  · 技术社区  · 3 年前

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

    我在下面写了一个脚本,

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

    发现它打印的是文字而不是线条。

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

    1 回复  |  直到 3 年前
        1
  •  1
  •   tripleee    3 年前

    您根本没有创建数组。其语法如下所示

    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
    

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

    ( readarray Bash v4+是否因此不可用(例如,目前在MacOS上是现成的。)