Bash中设置fs=$' '后${aggr[*]}拼接数组不插入换行问题
问题原因
${数组名[*]}拼接数组的分隔符由 Bash 内置的IFS(内部字段分隔符)变量决定,默认 IFS 的首字符是空格,所以你自定义的$fs变量不会生效,这是核心原因。- 代码存在两处语法错误:
- 变量名拼写不一致:前面定义的是
nmline=1,条件判断里用的是不存在的nwline,导致判断永远不成立,fs始终赋值为空格 - 条件判断后的逻辑运算符缺失:
(( nwline == 1 ))后面少了&&,原本的写法存在语法错误,不会按预期给fs赋值
- 变量名拼写不一致:前面定义的是
修复方法
方案一:临时修改IFS实现拼接
这种方法改动最小,直接利用${aggr[*]}的特性,临时修改IFS为你要的分隔符,用完恢复即可:
nl=3 nk=$((nl-1)) aggr=("$@") rst=$(tput sgr0) ctp=$(tput bold)$(tput setaf 39) nmline=1 # 修正变量名和逻辑运算符错误 (( nmline == 1 )) && fs=$'\n' || fs=' ' # 保存原有IFS,修改为自定义分隔符 old_ifs=$IFS IFS="$fs" # 拼接输出 printf '%s%s' "${ctp}${aggr[*]:0:nk}${rst}" "$fs" # 恢复原有IFS,避免影响后续代码 IFS=$old_ifs
方案二:循环拼接(兼容性更好)
如果不想修改全局的IFS变量,可以用循环逐个拼接元素,可控性更高:
nl=3 nk=$((nl-1)) aggr=("$@") rst=$(tput sgr0) ctp=$(tput bold)$(tput setaf 39) nmline=1 (( nmline == 1 )) && fs=$'\n' || fs=' ' output_str="" for ((i=0; i<nk; i++)); do output_str+="${aggr[i]}" # 最后一个元素后面不加分隔符 (( i < nk - 1 )) && output_str+="$fs" done printf '%s%s' "${ctp}${output_str}${rst}" "$fs"
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

