#!/bin/bash # 字符串拼接专题 name="Shell" url="http://c.biancheng.net/shell/" str1=$name$url #中间不能有空格 str2="$name $url" #如果被双引号包围,那么中间可以有空格 str3=$name": "$url #中间可以出现别的字符串 str4="$name: $url" #这样写也可以 str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号 echo "==========方式一=========" context='start ' # 文件读取方式一 cat '1.c' | while read line do echo ${line} context="${context}${line}" done # 无法打印出文件中的任何内容 :<<! 使用的是管道符号,这使得while语句在子shell中执行,这意味着while语句内部设置的变量、数组、函数等在循环外部都不再生效。 例如:echo haha | a=5,在命令执行结束后,变量a的值也不再是5。 ! echo $context echo "==========方式二=========" # 文件读取方式二 while read line do echo ${line} context="${context}${line}"' ' done < '1.c' #成功给context赋值 echo -e $context
特别说明:
如果被读的文件最后一行之后没有换行符 ,则read读取最后一行时遇到文件结束符EOF,循环即终止。
虽然,此时$line内存有最后一行,但程序已经没有机会再处理此行内容
解决方案
while read line || [[ -n ${line} ]]
这样当文件没有到最后一行时不会测试-n $line,当遇到文件结束(最后一行)时,仍然可以通过测试$line是否有内容来进行继续处理。