使用shell脚本读取文件

时间:2012-01-16 06:21:10

标签: linux shell

我有一个名为sqlfile的文本文件,其中包含以下内容:

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

的基于数组的解决方案

答案 2 :(得分:0)

我认为你需要把“文件”作为数组。否则,只要while完成,“files”就会存储最新的“line”。 尝试:

files=( "${files[@]}" $line )

答案 3 :(得分:0)

没错,你将最后一个值分配给“files”

您必须使用例如+ =而不是=

#!/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

答案 4 :(得分:0)

使用read是正常的,但您必须先设置IFS环境变量,否则每行都会删除前导和尾随空格:Preserving leading white space while reading>>writing a file line by line in bash

答案 5 :(得分: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

readarraymapfile的同义词。您可以在man bash

中阅读相关内容