首页 > 解决方案 > 整行的 bash 脚本中的“while .. read”循环是否存在系统分配的变量?

问题描述

我正在使用以下脚本模板来处理制表符分隔的文本文件:

  while IFS=$'\t' read -r column1 column2 column3 ; do
  printf "%b\n" "column1<${column1}>"
  printf "%b\n" "column2<${column2}>"
  printf "%b\n" "column3<${column3}>"
done < "myfile"

我仍然可以通过一些内部变量访问整行吗?

目的:文本文件是在另一个脚本中创建的外部驱动器的文件索引

find "$1" \( -size +40k -fprintf ~/Documents/fs/${1}.txt '%CY-%Cm-%Cd-%CH-%CM \t %-10s \t %h \t %f\n' \)

我想根据文件类型(视频、音频、图片、档案等)将这些行拆分为单独的文件。

当然我可以通过使用所有的字段变量来重新组装原始行,但是有没有更直接的方法?目前我的脚本是这样的:

while IFS=$'\t' read -r fdate fsize ffolder filename ; do
f_ext=${filename##*.}
f_ext=${f_ext,,}

if  [[ "$f_ext" == "jpg" || "$f_ext" == "jpeg" ||  "$f_ext" == "gif" || "$f_ext" == "png" || "$f_ext" == "bmp" || "$f_ext" == "cbr" || "$f_ext" == "psd" || "$f_ext" == "jp2" || "$f_ext" == "tif"  || "$f_ext" == "tiff" ]];then
echo -e "$fdate\t$fsize\t$ffolder\t$filename" >> "$fdir/${txtfnpure}Pics.txt"

elif  [[ "$f_ext" == "mka" || "$f_ext" == "m4a" ||  "$f_ext" == "aac" || "$f_ext" == "mp3" || "$f_ext" == "ogg" || "$f_ext" == "mp2" || "$f_ext" == "wav"  || "$f_ext" == "wave" || "$f_ext" == "ac3"  || "$f_ext" == "wma" || "$f_ext" == "flac" || "$f_ext" == "fla" || "$f_ext" == "aiff"  || "$f_ext" == "aif" ]];then

    ...

标签: bashsplit

解决方案


解决方法bash

while IFS='' read -r line; do
  IFS=$'\t' read -r column1 column2 column3 <<< "$line"
  echo "complete line: $line"
  printf "%b\n" "column1<${column1}>"
  printf "%b\n" "column2<${column2}>"
  printf "%b\n" "column3<${column3}>"
done < "myfile"

推荐阅读