Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 使用函数根据用户输入分配以逗号分隔的变量_Linux_Bash - Fatal编程技术网

Linux 使用函数根据用户输入分配以逗号分隔的变量

Linux 使用函数根据用户输入分配以逗号分隔的变量,linux,bash,Linux,Bash,我想根据用户的输入,使用函数分配以逗号分隔的变量名。 我将使用下面的脚本获取用户输入,它将调用函数进行变量赋值 while [ "$ans" != "q" ] do clear echo "Choose your subject" echo "Press q once done" echo " 1.Science" echo " 2.Maths" echo " 3.E

我想根据用户的输入,使用函数分配以逗号分隔的变量名。 我将使用下面的脚本获取用户输入,它将调用函数进行变量赋值

while [ "$ans" != "q" ]
do
clear
echo "Choose your subject"
echo "Press q once done"
echo " 1.Science"
echo " 2.Maths"
echo " 3.English"
...
read ans
case $ans in
1) clear
Science;;
2) clear
Maths;;
3) clear
English;;
....
esac
done
clear

subjects=""

Science()
{
subjects+="$subjects Science"
}
Maths()
{
subjects+="$subjects Maths"
}
English()
{
subjects+="$subjects English"
}
最后,我想让用户选择不同的主题:

等等:

科学、数学

数学、英语

科学、英语

英式

  • 在bash中,函数定义必须放在对函数的任何调用之前
  • subjects=”“
    必须放在
    while
    循环之前。否则,其值将在退出循环时丢失(将设置为空字符串)
  • +=
    运算符导致行
    subjects+=“$subjects Science”
    中出现双重串联,因为右侧已经包含
    subjects
    变量的展开。必须使用了
    subjects=“$subjects Science”
    ,或
    subjects+=“Science”
    (对于使用
    +=
    运算符的其他行也是如此)。此外,由于需要逗号分隔的列表,因此在连接字符串时必须使用
    字符,而不是空格字符。例如:
    subjects=“$subjects,Science”
  • 因此,更正后的脚本可以如下所示:

    #!/bin/bash
    
    subjects=""
    
    Science() {
        subjects="$subjects,Science"
    }
    
    Maths() {
        subjects="$subjects,Maths"
    }
    
    English() {
        subjects="$subjects,English"
    }
    
    while [ "$ans" != "q" ]; do
        clear
        echo "Choose your subject"
        echo "Press q once done"
        echo " 1.Science"
        echo " 2.Maths"
        echo " 3.English"
    
        read -r ans
        case $ans in
            1) Science;;
            2) Maths;;
            3) English;;
        esac
    done
    
    subjects=${subjects:1}  # to remove the leading ',' character
    echo "Your selections are $subjects"
    

    注意:我通常不会只使用函数将一个简单字符串附加到变量。

    是否有错误或困难,或者您是否陷入了困境?没有错误,但没有为主题变量分配值感谢Jetchisel,您给了我一些想法,我设法在不调用函数的情况下获取变量值,[链接]谢谢Nejat Aydin先生,这个解决方案很有效!仅供参考,我还设法在不使用函数的情况下完成它:
    read-r ans case$ans in 1)clear subjects=“${subjects}${subjects:+,}Science”;;2) 清除科目=“${subjects}${subjects:+,}数学”;;3) 清除主题=“${subjects}${subjects:+,}英语”;;esac完成了
    很高兴听到这个消息。