我正在尝试将两个非常不同的脚本合并在一起,以实现整合和易用性。我知道我希望这些脚本的外观和操作,但我可以使用一些帮助入门。以下是脚本的流程和外观:
输入文件将是具有以下语法的标准文本文件:
#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"
这些方面的东西......我只是把它们放在一起有困难。
答案 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"
请注意,脚本不会跳过空行。