#!/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\n' # 文件讀取方式一 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}"'\n' done < '1.c' #成功給context賦值 echo -e $context
特別說明:
如果被讀的文件最后一行之后沒有換行符\n,則read讀取最后一行時遇到文件結束符EOF,循環即終止。
雖然,此時$line內存有最后一行,但程序已經沒有機會再處理此行內容
解決方案
while read line || [[ -n ${line} ]]
這樣當文件沒有到最后一行時不會測試-n $line,當遇到文件結束(最后一行)時,仍然可以通過測試$line是否有內容來進行繼續處理。
