标题:[实践OK]对文本里的内容组装SQL之用Shell的for循环读取文件里有空格时出现一行变两行输出的问题解决方法。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Sat, 29 Sep 2018 14:35:31 +0000 作者:jackxiang 地址:http://jackxiang.com/post/9921/ 内容: cat a.txt jack 1 tianjin 2 old5 3 #!/bin/bash IFS_old=$IFS IFS=$'\n' for line in $(cat a.txt);do echo $line done IFS=$IFS_old sh read.sh jack 1 tianjin 2 old5 3 加上模拟输出: insert into t set name='xxx', id=N; #!/bin/bash IFS_old=$IFS IFS=$'\n' for line in $(cat a.txt);do #echo $line; name=$(echo $line|cut -d" " -f 1) age=$(echo $line|cut -d" " -f 2) echo "insert into t set name='${name}',id=${age};" done IFS=$IFS_old sh read.sh insert into t set name='jack',id=1; insert into t set name='tianjin',id=2; insert into t set name='old5',id=3; 行内有空格换行的原因: 如果输入文本每行中没有空格,则line在输入文本中按换行符分隔符循环取值. 如果输入文本中包括空格或制表符,则不是换行读取,line在输入文本中按空格分隔符或制表符或换行符特环取值. 可以通过把IFS设置为换行符来达到逐行读取的功能. demo: 假设现需要读取如下的文件rollback_config.txt: ROLLBACK_SERVICES:upserv  checkserv ROLLBACK_VERSION:v1.1 使用   for line in `cat rollback_config.txt`; do echo "${line}"; done  读取的结果会是: ROLLBACK_SERVICES:upserv checkserv ROLLBACK_VERSION:v1.1 显然不是我们想要的。 解决方法: IFS_old=$IFS IFS=$'\n' for line in  `cat  rollback_config`;do echo "$line" done; IFS=$IFS_old 这样一来就可以了! IFS的默认值为:空白(包括:空格,制表符,换行符). --------------------- 本文来自 潼潼水势向江东 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/zhongjling/article/details/52859055?utm_source=copy 二)用AWK就很方便处理,如下,注意下单引号是三个单引号,中间那个被转义,才输出一个单引号 '\'' : cat readawk.sh #!/bin/bash cat a.txt |awk '{print "insert into t set name='\''"$1"'\'',id="$2.";"}' insert into t set name='jack',id=1; insert into t set name='tianjin',id=2; insert into t set name='old5',id=3; Generated by Jackxiang's Bo-blog 2.1.1 Release