如何将sysctl -a命令的每一行输出正确存入Shell数组
正确实现方法
方案1:Bash 4.0及以上版本(推荐)
直接使用内置命令mapfile(也叫readarray)实现,写法最简单性能也最好:
mapfile -t TAB < <(sysctl -a)
参数说明:-t作用是自动移除每行末尾的换行符,刚好符合存储原始行内容的需求。
方案2:兼容低版本Bash的while循环写法
你之前的循环写法问题出在IFS的配置错误,正确写法如下:
# 先清空数组避免遗留数据 TAB=() while IFS= read -r line; do TAB+=("$line") done < <(sysctl -a)
写法说明:
IFS=临时把输入字段分隔符设为空,让read命令不会修剪行首、行尾的空白字符,也不会对行内容做任何分割,完整读取整行-r参数禁止read把行末的反斜杠识别为续行符,避免内容被篡改
错误原因说明
- 最开始的
TAB=($(sysctl -a))写法问题:Shell默认的IFS(输入字段分隔符)包含空格、制表符、换行三类空白符,命令替换结果展开时会按所有空白符拆分,自然会把同一行内的内容拆成多个数组元素。 - 之前的循环写法问题:
IFS=$'\n' read -r line的配置不对,设置IFS为换行符不会阻止read修剪行首尾的空白,也解决不了行内拆分的问题。
验证方法
执行以下命令即可查看数组元素是否和原行一一对应:
printf "第%d行内容:%s\n" "${!TAB[@]}" "${TAB[@]}"
内容的提问来源于stack exchange,提问作者achille
相关产品推荐
相关产品推荐

