![从文本文件读取输入的 Shell 脚本](https://linux22.com/image/194017/%E4%BB%8E%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E8%BE%93%E5%85%A5%E7%9A%84%20Shell%20%E8%84%9A%E6%9C%AC.png)
我正在编写一个从文本文件读取输入的 shell 脚本
Path1:/home/demo/path0
FILE1:test.dat,sample.txt
PATH2:/home/demo/path1
FILE2:demo1.dat,xyzb.txt
PATH3:/home/demo/path2
FILE3: samplecsv.csv,somepdf.pdf
我需要在单独的文件夹中输出FILE1
文件test.dat
,在单独的文件夹中文件路径。sample.txt
FILE2:demo1.dat,xyzb.txt
我已经尝试过以下但没有得到想要的结果
val=`cat filename`
Count=${#val[@]}
for (( i=0; i<$Count ; i++))
do
var=`echo ${val[i]} | sed -e 's/\.//g'`
one=$(grep PATH1 ${val[i]} | awk -F':' '{print $2}');
two=$(grep FILE1 ${val[i]} | awk -F':' '{print $2}');
done
echo $var
echo $one
echo $two
答案1
笔记:
- 不要用来
for
读取文件的行 - 使用
$(...)
而不是`...`
--参见 https://github.com/koalaman/shellcheck/wiki/SC2006 更多细节。 awk
可以做该grep
做的事情,因此您不需要在管道中同时执行这两者。但是,在这种情况下,您都不需要。
我会写
# so the case statement below will match case-insensitively
shopt -s nocasematch
paths=()
files=()
while IFS=: read -r key value; do
case $key in
PATH*) paths+=("$value") ;;
FILE*) files+=("$value") ;;
esac
done < filename
declare -p paths files
这输出
declare -a paths=([0]="/home/demo/path0" [1]="/home/demo/path1" [2]="/home/demo/path2")
declare -a files=([0]="test.dat,sample.txt" [1]="demo1.dat,xyzb.txt" [2]=" samplecsv.csv,somepdf.pdf")
您可以根据需要迭代数组。