阅读使用shell脚本
问题描述:
我有一个名为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
答
变量只能容纳一个元素,你想要的是一个阵列
#!/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
答
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
答
查看基于阵列的解决方案我认为您需要将“文件”制作为数组。否则,一旦完成,“文件”存储最新的“行”。 尝试:
3210
答
这是正确的,你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
答
使用读是好的,但你必须首先设置IFS环境变量,否则从每行删除前导空白和尾随空白:Preserving leading white space while reading>>writing a file line by line in bash。
答
所有你需要做的是:
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
了解它确实+ =在这里工作是不是为我工作.. – 2012-01-16 06:48:47
您不必第一个'echo';你可以非常清楚使用'文件+ =“$线”',它会更简单,更高效(无子shell)。 – 2012-01-16 06:49:10
@AbdulManaf:您使用'bash'?哪个版本的'bash'(用'bash --version'找出来)。 – 2012-01-16 06:49:55