テキストファイルから入力を読み取るシェルスクリプトを作成しています。
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
ファイルの行を読み取るために使用しないでください。- --see
$(...)
の代わりに`...`
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")
必要に応じて配列を繰り返すことができます。