BASH使用文件中的列表作为变量来选择CASE

BASH使用文件中的列表作为变量来选择CASE,bash,Bash,这是我当前脚本的一部分,目前只有12个数据,但数据的数量和名称将随时间而变化,因此我需要从单独的文本文件的列表中导入数据/变量(name01、name02、name03…)。假设文件内部看起来像这样: name01=$(echo "Data 01") name02=$(echo "Data 02") echo "Please select data : " PS3="Answer : " optionname=( "$name01" "$name02" "$name99") select opt

这是我当前脚本的一部分,目前只有12个数据,但数据的数量和名称将随时间而变化,因此我需要从单独的文本文件的列表中导入数据/变量(name01、name02、name03…)。假设文件内部看起来像这样:

name01=$(echo "Data 01")
name02=$(echo "Data 02")
echo "Please select data : "
PS3="Answer : "
optionname=(
"$name01"
"$name02"
"$name99")
select opt1 in "${optionname[@]}"
do
    case $opt1 in
        $name01) echo "$name01" ; break ;;
        $name02) echo "$name02" ; break ;;
        $name99) echo "Please enter the data : " ; read "name99" ; break ;;
        *) echo invalid option;;
    esac
done
需要建议


提前感谢

如果您只想根据文件中的选项列表验证用户输入,那么您只需使用
grep

给出了
options.txt
中的选项列表

aa bb
aaaa ccc
ab cdd
和一个脚本(
option.bash
):

您可以使用grep验证用户是否输入了允许的选项:

#!/bin/bash

read -p 'Please enter your favourite fruit: ' fruit_input

if grep -q -o -x -- "$fruit_input" options.txt; then
    echo "Your favourite fruit is: $fruit_input"
else
    echo "The only fruits you're allowed to choose are:"
    cat options.txt
fi

这是我的脚本的更新,列表在
/tmp/name\u list

./option.bash
Please enter your favourite fruit: apple
Your favourite fruit is: apple

./option.bash
Please enter your favourite fruit: cheese
The only fruits you're allowed to choose are:
banana
apple
pear

感谢@Robert Seaman提醒我使用
if-then-else
而不是
case

你的问题不够清楚。另外,在你的
案例中阅读
语句会让你感到非常困惑。您是否希望为每个选项添加不同的逻辑?在使用case语句之前,您是否试图寻找用户输入?@RobertSeaman该选项指向我的文本文件的每一行,是的,此脚本需要用户输入才能继续。但是如果选项位于文本文件中,并且您对每个选项都有单独的逻辑,您将如何在
case
语句中表示该逻辑?最好的方法是完全废弃文本文件,并单独列出
case
语句中的选项。旁注:
name01=$(echo“Data 01”)
name01='Data 01'
相同。
./option.bash
Please enter your favourite fruit: apple
Your favourite fruit is: apple

./option.bash
Please enter your favourite fruit: cheese
The only fruits you're allowed to choose are:
banana
apple
pear
touch /tmp/number_list
touch /tmp/number_name_list
amount=$(cat /tmp/name_list | wc -l)
a=0
while [[ $a -lt $amount ]]; do
    let a=$a+1
    echo $a >> /tmp/number_list
    name=$(sed -n "${a}p" /tmp/name_list)
    echo "$a $name">> /tmp/number_name_list
done

cat /tmp/number_name_list
read -p "Please enter the number or enter new name : " input
if
    grep -q -o -x -- "$input" /tmp/number_list
then
    folder=$(sed -n "${input}p" /tmp/name_list)
    echo "its $folder"
    mkdir /tmp/"$folder"
else
    echo "its $input"
    mkdir /tmp/"$input"
fi