shell 指令碼中將輸出內容賦值給乙個變數時不換行

2021-08-16 19:31:51 字數 1890 閱讀 1905

如題,將某命令的輸出結果賦值給乙個變數 a

如果使用 echo $a 輸出變數,則變數中的 換行都會被忽略掉,所有內容輸出到一行

而使用 echo "$a"  可正常輸出變數中的換行

當我們要將命令的輸出儲存到乙個變數,再對每一行遍歷進行某些操作時不能使用 

[html]view plain

copy

for item in "$a";do  

## do something  

done  

語法,這樣取到的變數 item  不是$a 中的一行,而是以空格分隔的乙個個字串

這種情況可以使用以下語法解決

[html]view plain

copy

echo "$a" | while read i  

do  

done  

測試**:

[html]view plain

copy

#!/bin/bash  

a=ls -l

echo '***********************************=  echo $a'  

echo $a  

echo "$a" | while read i  

do  

echo $i  

#       break  

done  

while迴圈位於管道中,這意味著在執行過程中,while迴圈實際是位於乙個新的shell中的,while迴圈中的變數和檔案開頭定義的變數是兩個不同的變數,所以while迴圈中所改變的值在while迴圈結束後無法儲存下來。解決這個問題的方法就是不要使用管道。
對於檔案的解決方法:

解決方案: 用重定向而不是管道,舉例:

-(dearvoid@linuxeden:forum)-(~/tmp)- [31048 0]

; cat file 

1 2 3 4 5 

-(dearvoid@linuxeden:forum)-(~/tmp)- [31048 0]

; cat file.sh 

#!/bin/bash arr=() i=0 while read line; do     arr[i++]=$line done < file echo $ 

-(dearvoid@linuxeden:forum)-(~/tmp)- [31048 0]

; ./file.sh 

5shell 中可以使用 while 按行讀取乙個檔案,同時也可以使用 while 按行讀取乙個變數的值,或者乙個命令的輸出。方法有以下4種,分別是程序替換,管道,here document 和here string(來自chinaunix: 

#! /bin/bash

var=$(cat urfile)

echo "process substitution"

while read line

doecho "$line"

done < <(echo "$var")

echo "pipe"

echo "$var" | while read line

doecho "$line"

done

echo "here document"

while read line

doecho "$line"

done <

$var

!echo "here string"

while read line

doecho "$line"

done <<< "$var"

exit

shell 指令碼變數賦值

簡單的變數賦值a 879 echo the value of a is a.用let賦值let a 16 5 echo the value of a is now a.read命令是系統內建命令 語法格式 read 變數1 變數2 用 read 命令 這也是一種賦值 echo n enter a r...

Shell指令碼輸出顏色

輸出顏色可以美化介面 給人愉快的心情,哈 指令碼可以這樣寫 bin bash 先定義一些顏色 red e 0 31m 紅色 red e 1 31m green e 0 32m 綠色 green e 1 32m yellow e 0 33m 黃色 yellow e 1 33m blue e 0 34m...

Shell指令碼 cat EOF輸出多行

在某些場合,可能我們需要在指令碼中生成乙個臨時檔案,然後把該檔案作為最終檔案放入目錄中。可參考ntop.spec檔案 這樣有幾個好處,其中之一就是臨時檔案不是唯一的,可以通過變數賦值,也可根據不同的判斷生成不同的最終檔案等等。一 cat和eof cat命令是linux下的乙個文字輸出命令,通常是用於...