2012-01-16 150 views
4

我有一個名爲sqlfile的文本文件,具有下列內容的文件:閱讀使用shell腳本

a.sql 
b.sql 
c.sql 
d.sql 

我想的是,將它們存儲在變量,然後打印使用for循環。 但是在這裏,我只在腳本的輸出中獲得了d.sql

腳本:

#!/bin/bash 

while read line 
do 
files=`echo $line` 
done < /home/abdul_old/Desktop/My_Shell_Script/sqlfile 

for file in $files 
     do 
       echo $file 
     done 

回答

6

變量只能容納一個元素,你想要的是一個陣列

#!/bin/bash 

while read line 
do 
    files+=("$line") 
done < /home/abdul_old/Desktop/My_Shell_Script/sqlfile 

for file in "${files[@]}" 
do 
    echo "$file" 
done 
5
while read line 
do files="$files $line" 
done < /home/abdul_old/Desktop/My_Shell_Script/sqlfile 

files=$(</home/abdul_old/Desktop/My_Shell_Script/sqlfile) 

files=$(cat /home/abdul_old/Desktop/My_Shell_Script/sqlfile) 

你在循環中做了太多工作。

中間替代品與bash一起使用;另外兩個用大多數炮彈工作。優先選擇$(...)以反引號。

這段代碼假設文件名中沒有空格來搞砸了。如果在文件名中使用空格,則必須稍微更加努力 - 通過SiegeX

0

查看基於陣列的解決方案我認爲您需要將「文件」製作爲數組。否則,一旦完成,「文件」存儲最新的「行」。 嘗試:

​​3210
0

這是正確的,你assifn最後的值設置爲 「文件」

必須使用例如+ =代替=

#!/bin/bash 

while read line 
do 
files+=`echo " $line"` 
done < /home/abdul_old/Desktop/My_Shell_Script/sqlfile 

for file in $files 
     do 
       echo $file 
     done 
+0

瞭解它確實+ =在這裏工作是不是爲我工作.. – 2012-01-16 06:48:47

+0

您不必第一個'echo';你可以非常清楚使用'文件+ =「$線」',它會更簡單,更高效(無子shell)。 – 2012-01-16 06:49:10

+0

@AbdulManaf:您使用'bash'?哪個版本的'bash'(用'bash --version'找出來)。 – 2012-01-16 06:49:55

0

所有你需要做的是:

readarray myData < sqlfile 

這將會把文件中的行到一個數組稱爲myData
現在您可以訪問這些線路是這樣的:

printf "%s\n" "${myData[0]}" #outputs first line 
printf "%s\n" "${myData[2]}" #outputs third line 

你可以迭代它:

for curLine in "${myData[@]}"; do 
    echo "$curLine" 
done 

注意這些行也包含\n字符。要刪除尾隨換行符您可以使用-t標誌是這樣的:

readarray -t myData < sqlfile 

readarray是同義詞mapfile。您可以在man bash