Shell脚本根据文件输入执行不同的功能

时间:2013-08-09 04:31:55

标签: linux bash shell sh

我正在尝试将两个非常不同的脚本合并在一起,以实现整合和易用性。我知道我希望这些脚本的外观和操作,但我可以使用一些帮助入门。以下是脚本的流程和外观:

输入文件将是具有以下语法的标准文本文件:

#Vegetables
Broccoli|Green|14
Carrot|Orange|9
Tomato|Red|7

#Fruits
Apple|Red|15
Banana|Yellow|5
Grape|Purple|10

脚本将接受此文件的输入。它会忽略注释部分,但使用它们来指示输出。因此,基于它是一个蔬菜的事实,它将使用分隔符(|)之间列出的值执行特定的功能。然后它将转到Fruits并根据该分隔符执行与值不同的操作。也许,我会将Vegetable / Fruit添加到其中一个值,并依赖于它将执行该函数的值,而在此循环中读取文件。感谢您帮助我们开始这项工作。

更新: 所以我正在尝试实现IFS设置并考虑更合理的安排。输入文件将在参数中显示“类别”。所以设置将是这样的:

Vegetable|Carrot|Yellow
Fruit|Apple|Red
Vegetable|Tomato|Red

从那里,脚本将读入行并执行该功能。所以基本上这种类型的shell设置:

while read -r category item color
do
    if [[ $category == "Vegetable" ]] ; then
        echo "The $item is $color"
    elif [[ $category == "Fruit" ]] ; then
        echo "The $item is $color"
    else
        echo "Bad input"
 done < "$input_file"

这些方面的东西......我只是把它们放在一起有困难。

2 个答案:

答案 0 :(得分:0)

使用read输入行。对其前缀做一个案例陈述:

{
  while read DATA; do
    case "$DATA" in
       \#*) ... switch function ...;;
         *) eval "$FUNCTION";;
    esac
  done
} <inputfile

根据您的问题,您可能需要尝试在读取之前设置$ IFS并在1中读取多个变量。

答案 1 :(得分:0)

每次遇到#指令时,您都可以重新定义处理函数:

#! /bin/bash
while read line ; do
    if [[ $line == '#Vegetables' ]] ; then
        process () {
            echo Vegetables: "$@"
        }
    elif [[ $line == '#Fruits' ]] ; then
        process () {
            echo Fruits: "$@"
        }
    else
        process $line
    fi
done < "$1"

请注意,脚本不会跳过空行。