美文网首页
九、处理用户输入

九、处理用户输入

作者: Miridescent | 来源:发表于2018-06-01 11:29 被阅读17次

    简单目录

    • 1.命令行参数
    • 2.处理命令行选项和命令行参数参数
    • 3.read命令获取用户输入

    1.命令行参数

    在命令行直接执行脚本都会,同样的,在执行脚本的同时可以带参数

    读取参数

    看下面的脚本例子

    #!/bin/bash
      
    echo $0
    echo $1
    echo $2
    
    

    运行结果

    ➜  ./test 1 2
    ./test
    1
    2
    

    bash shell会用一些特殊变量接收这些参数,$0脚本名、1第一个参数以此类推,一直到$9
    *注意 $0是脚本的名字和路径
    *注意 参数是以空格区分的,如果字符串中间有空格的话,可以用引号将字符串包裹起来(单双引号均可),如下

    ➜ ./test 1 "hello world"
    ./test
    1
    hello world
    

    *注意 如果传递参数超过9个,超过的部分用花括号包裹起来即可,如下

    ${10}
    

    *注意 如果想去掉$0中的路径,可以用basename命令,如下

    $(basename $0)
    

    *注意 如果脚本中用了变量,但是实际没有传参数,运行脚本时会报错
    为了解决参数未传的问题,可以使用-n命令在脚本中对变量进行检测,如下

    if [-n "$1"]
    then
      .......
    

    特殊参数变量

    bash shell中提供了一些特殊的变量,帮助处理参数
    $#命令行参数个数
    $*将所有参数转换成一个词
    $@将所有参数转换成一个字符串,将每一个参数当做一个词
    shift命令获奖没测参数变量向左移动一个位置,即$3的值会移动到$2中,这样会方便我们便利参数
    *注意 移动后,左面的值将被删除,不可找回
    *注意 shift命令后可以接一个参数,表示移动多少位

    2.处理命令行选项和命令行参数

    命令行中不光可以传参数,还可以传命令行选项
    通常的shell脚本会用--将选项和参数分割,这样,在脚本内部可以根据--区分

    getopt命令格式化命令行参数,格式如下
    getopt optstring parameters
    

    optstring定义了那些字母是命令行选项,并且那些带参数(字母后跟冒号标识选项有参数)
    parameters是参数
    举例如下:

    ➜ getopt ab:cd -a -b test1 -cd test2 test3
     -a -b test1 -c -d -- test2 test3
    

    格式化之后的参数通过--将选项与参数分开,并在适当的选项后加了参数
    *注意 命令行中出现未定义的选项,getopt命令会报错,如果不想报错,可以加-q参数

    getopts命令

    getoptsgetopt的基础上增加了两个环境变量
    OPTARG: 如果一个选项要跟一个参数,则OPTARG会保存这个值
    例子

    #!/bin/bash
    echo 
    while getopts :ab:c opt
    do
                    case "$opt" in
                            a) echo "选项a";;
                            b) echo "选项b, b选项带的参数$OPTARG";;
                            c) echo "选项c";;
                            *) echo "结束"
                    esac
    done
    

    执行结果

    ➜  ./test -ab test1 -c
    选项a
    选项b, b选项带的参数test1
    选项c
    

    *注意 上面脚本中用到的optOPTARG变量

    OPTIND:getopts每处理一个参数,OPTIND会增一,这样就可以知道参数的位置
    例子:

    #!/bin/bash
      
    echo 
    while getopts :ab:c opt
    do
                    case "$opt" in
                            a) echo "选项a";;
                            b) echo "选项b, b选项带的参数$OPTARG";;
                            c) echo "选项c";;
                            *) echo "结束"
                    esac
    done
    
    shift $[$OPTIND - 1]
    
    echo "下面的是参数"
    
    count=1
    for param in "$@"
    do
            echo "参数$count: $param"
            count=$[$count-1]
    done
    

    运行结果

    ➜  ./test -ab test1 -c test2 test3
    
    选项a
    选项b, b选项带的参数test1
    选项c
    下面的是参数
    参数1: test2
    参数0: test3
    

    *注意 linux中有一些约定俗成的选项标准,所以在写脚本的时候最好遵循这些标准

    3.read命令获取用户输入

    read命令从标准输入接收

    例子:

    #!/bin/bash
      
    echo -n "请输入你的名字:"
    read name
    echo "你好: $name"
    

    执行结果:

    ➜   ./read
    请输入你的名字:haha
    你好: haha
    

    -n选项不会在字符串末尾加上换行
    -p选项可以直接在read命令后指定变量,上面的脚本可简写为

    #!/bin/bash
      
    read -p "请输入你的名字:" name
    echo "你好: $name"
    

    *注意 -p命令可以指定多个变量,输入时用空格区分
    *注意 如果输入大于指定变量个数,则会依次分配,直到最后一个变量接收所有剩下的参数
    *注意 如果-p命令没有指定变量,则默认输入会存储在REPLY变量中

    -t选项可以指定一个定时器,指定read命令等待输入的秒数,如下

    read -t 5 -p "请输入:" 
    

    *注意 如果超出时间,则read命令会以非0状态码结束

    -s选项可以隐藏输入,常见的有在命令行输入密码的时候

    read命令从文件接收输入

    read命令读取文件时,每执行一次read命令会读取文件中的一行文本,如果没有内容,则read命令会以非0状态码退出
    例子:

    #!/bin/bash
    cat file | while read line
    do
            echo "$line"
    done
    

    相关文章

      网友评论

          本文标题:九、处理用户输入

          本文链接:https://www.haomeiwen.com/subject/lstxsftx.html