首页 > 系统相关 >Shell处理用户输入

Shell处理用户输入

时间:2022-10-17 18:02:29浏览次数:51  
标签:选项 Shell 变量 用户 参数 命令行 getopt 输入 读取

命令行选项

  • 定义

    • 可以修改命令的行为的单个字母,在命令行中通常带有-等字符

    • 读取命令行选项

      • 根据位置参数变量

        • 处理简单选项

          while循环+shift

          while循环用于遍历选项或参数是否为空值,以及选项执行的动作的循环,shift的作用是遍历每一个选项,然后进行销毁

        • 分离参数和选项

          使用--作为选项和参数的分隔符,--前为选项,--后为参数,通常遇到--后,把--用shfit命令处理掉,再用break跳出循环

        • 处理带值选项

          组合运用$1和$2

          $1用于处理命令行选项,$2用于处理命令行参数,通常把$2赋值给一个变量进行引用,引用完毕通过shift处理掉$2,以供下一个带参数选项使用

           注意事项
           根据位置参数变量读取命令行参数这种方法不能识别组合选项,如-abc,三个选项合并为一个选项这种
      
      • 使用getopt

        可以把命令行参数和命令行选项转化为脚本需要的标准格式,既可以识别单独的命令行选项,也可以识别带参数的命令行参数,处理参数完毕后,会输出处理结果

        • 基本格式
          getopt  -q  optstring parameters
          optstring负责提供选项信息,如是否带参数,如果带参数,就在选项字母后面加上冒号:
          parameters是我们提供的选项和参数
        
        • 脚本中使用

          由于getopt只会输出处理结果,不会把处理结果替换原值,因此需要配合set进行替换原命令行参数的值,即getopt负责格式化,set负责替换

        set -- \$(getopt ab:cd "$@")

      • 使用getopts(getopt升级版)

        作为getopt的加强版,解决getopt不能处理带空格的参数的缺陷,同时独立完成格式化和替换参数原值,把结果保存在指定变量

        • 基本格式
          getopts :ab:cd   variable
          第一个冒号是代表忽略错误,第二个冒号是代表改选项带参数
          getopts内置两个环境变量,一个是$OPTAGR,代表选项的参数值,一个是$OPTINT代表正在处理参数的位置
        
        • 脚本中使用
           while getopts :ab:cd   variable
           variable存放的是命令行选项,通常配合case,有点类似于位置参数$1的作用
        

命令行参数

  • 定义

    • 位于命令后面的数据
  • 读取参数

    • 根据位置参数变量

      • $0代表程序名

        • 一般用于读取脚本名

          • 使用name=$(basename $0)可以返回一个不包含路径的文件名,并保存在name变量中
      $1代表第一个参数
      $2代表第二个参数
      ${10}代表第10个参数
      ${11}代表第11个参数
      $#代表参数的数量
      $*存储所有的参数的值
      $@存储所有的参数的值
      
      • 注意事项
       $1-9代表参数1到9,超过9就需要用${n}来表示
       传参的值是一个带有空格的字符串,需要用双引号来括起来,否则将看出是两个参数值
       为了避免执行脚本时,用户不小心忘记传参,必须在执行脚本之前,对参数进行检查,可以通过[ -n "$num" ]的方式检查位置参数变量是否有数据
       如果执行脚本是需要多个参数,判断用户输入的参数数量是否符合要求,可以通过[ $# -ne num ] 来提示用户按要求输入参数
       $#变量代表了最后的参数,如果想读取该变量的值,使用${!#};当用户没有输入参数时,$#为0,\${!#}变量会返回脚本名
       $*与$@的区别在于,$*会把所有的参数当成一个字符串,$@会把每一个参数都单独处理,通常使用$@来进行遍历参数
    
    • 移动变量

      • shift
      作用是把参数移除参数变量,默认把所有的参数变量向左移动一个位置,$0除外
      shift n 可以指定移动的位置,可理解为消灭前n个参数
      参数被移出列表之后,该值就丢失了,无法恢复
    

获取用户输入

  • read命令

    • 接受和处理用户键盘输入

      • 用于接受用户键盘输入,并把输入保存到一个变量,方便后续调用,如果不知道变量,会保存在一个$REPLY环境变量中

        read -p "tip" variable

      • 设置用户输入超时时间为5秒

        read -t 5

      • 设置接受字符个数为1并自动退出

        read -n1

      • 设置加密的方式输入,适用于接受密码输入

        read -s

    • 读取文件输入

      • 默认一次读取一行,如果想从一个文件中读取多行,可以利用cat命令,查看所有行内容,把结果重定向给循环,再通过while循环加read一直读取,并保存再变量中

        cat file | while read variable

标签:选项,Shell,变量,用户,参数,命令行,getopt,输入,读取
From: https://www.cnblogs.com/tang-learning/p/16800073.html

相关文章

  • Oracle-快速重建用户&导入数据
    ##锁定用户alteruserUSERNAMEaccountlock;##查看用户资源占用selectsaddr,sid,serial#,paddr,username,statusfromv$sessionwhereusername='USERNAME';##停......
  • 更改输入 空格不变
    #include<iostream>#include<string.h> #include<limits.h>#include<float.h>#include<stdio.h>#pragmawarning(disable :4996)usingnamespacestd; intmain()......
  • quartus II输入原理图及仿真步骤(转)
    https://www.cnblogs.com/mikewolf2002/p/10237681.html?ivk_sa=1024320uquartusII输入原理图及仿真步骤   在QuartusII中输入原理图以及实现仿真是学习基本数字......
  • GitLab 用户头像无法显示解决方法
    修改/etc/gitlab/gitlab.rbgitlab_rails['gravatar_plain_url']='https://gravatar.loli.net/avatar/%{hash}?s=%{size}&d=identicon'gitlab_rails['gravatar_ssl_ur......
  • 在Linux系统安装及使用ShellClash的教程
    支持Debian、CentOS、Ubuntu、Armbian等绝大多数发行版Linux系统下安装及使用本脚本!使用步骤:登陆SSH使用SSH连接工具来登陆SSH,推荐putty(体积最小),JuiceSSH(支持安卓手机),或......
  • 数据集 | 基于用户行为的贷款预测测试集
    下载数据集请登录爱数科一个组织想要预测谁是消费贷款产品的潜在违约者。他们有基于他们所观察到的顾客历史行为的数据。因此,当他们获得新客户时,他们希望预测谁的风险更大,谁......
  • 使用Powershell/cmd提取msi安装包中的文件
    在前面的文章中介绍过如何使用msiexec这个程序执行自动化安装(https://www.cnblogs.com/zhaotianff/p/11558602.html)如果需要提取msi安装包中的文件,也可以使用msiexec程......
  • 云与大数据时代,华为云助企业用户安全稳健发展
    云与大数据时代,华为云助企业用户安全稳健发展​随着云计算产业的蓬勃高速发展,各种云服务成为企业IT的底层依赖,安全性和稳定性始终是企业业务正常运行的最基础保障,而海量增长......
  • io流-字符流和字节输入流(Reader)
    字符流当使用字节流读取文本文件时会出现一些小问题就是当我们遇到中文字符时可能不会显示完成的字符那时以为一个中文字符可能占用多个字节存储所以java提供一些......
  • io流字节输入流一次读取多个字节
    字节输入流一次读取多个字节字节输入流一次读取多个字节的方法:intread(byte[]b)从输入流中读取一定数量的字节并将其存储在缓冲区数字b中明确两件事情:1.方法的参......