如何在Korn Shell中使用纯原生方法捕获命令输出的第二行到变量
失效原因
你尝试的写法无法生效的核心原因是 ksh88 中管道右侧的所有命令/代码块都会在独立子shell中执行,子shell内对变量的修改不会同步到父shell,因此哪怕管道后的代码成功读取到了第二行内容,父shell中的variable变量依然是空值。你调整IFS的尝试也没有解决子Shell的核心问题,所以无法生效。
纯Shell实现方案
以下两种方案均为ksh内置功能实现,不依赖任何外部工具:
方案1:使用Here Document避免子Shell(兼容性最好)
把命令输出通过Here Document重定向到当前Shell的代码块,两次read分别丢弃第一行、读取第二行到目标变量:
{ read -r junk # 丢弃第一行输出 read -r variable # 读取第二行到目标变量 } << EOF $(your_command) EOF
方案2:用数组存储所有行后取值(写法更简洁)
先修改IFS为换行符,把命令输出按行拆分存入数组,直接取下标为1的元素(ksh数组下标从0开始)即为第二行内容,记得用完恢复IFS:
old_IFS=$IFS IFS=' ' # 按行拆分命令输出存入数组 output_lines=($(your_command)) variable=${output_lines[1]} IFS=$old_IFS
内容的提问来源于stack exchange,提问作者bakunin
相关产品推荐
相关产品推荐

