bash脚本 - 如何使用case语句查找和处理从while循环读取的最后一项

时间:2018-01-25 22:05:32

标签: bash shell unix

我正在使用while循环来读取文件中的项目列表。在while循环中, 我还使用case语句来处理特定的条件/列。我无法弄清楚的一个条件是 如何处理列表中的 last 项目。

例如:

#!/usr/local/bin/bash
FILE="myoutputfile.out";
while IFS='' read -r column; do
  case column in
    visitor_id)
       echo "isnull($column|| '[|]' ||";;
       updated)
       echo "isnull($column::text || '[|]' ||";;
             *)
       echo "isnull($column::text,'[null!]') || '[|]' ||";;
  esac
done <"$FILE"

假设列表内容为:

visitor_id
updated
visitor_list_1
visitor_list_2
visitor_list_3
visitor_list_4
visitor_list_5

我需要使用“ visitor_list_5 ”做一些不同的事情。注意,除了前两个项目之外,列表每次都会有所不同 我有一个案例,但我需要处理最后一个这样的事情:

   last_column)
   echo "isnull(visitor_list_5::text,'[null!]')) as md5sum"

1 个答案:

答案 0 :(得分:1)

使用wc获取行数。如下所示:

file="myoutputfile.out";
linecount=$(wc -l $file)
counter=1
while IFS='' read -r column; do
  case column in
    visitor_id)
       echo "isnull($column|| '[|]' ||";;
       updated)
       echo "isnull($column::text || '[|]' ||";;
             *)
       echo "isnull($column::text,'[null!]') || '[|]' ||";;
  esac
  if [ "$counter" -eq "$linecount" ]; then
      #you found the last line
  fi
  ((counter++))
done <"$file"

另外,请考虑避免使用所有大写变量名。您的系统变量都是大写,如PATH,您可能会发生冲突。