2012-01-16 132 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