我有一个名为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
答案 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
readarray
是mapfile
的同义词。您可以在man bash