bash shell如何获取命令行参数(添加到命令后的数据)、命令行选项(确定命令行为的英文字母)、键盘输入数据

操作命令行参数

1 读取参数

  1. bash shell用位置参数变量(positional parameter)存储命令行输入的所有参数,包括程序名。其中,$0表示程序名,$1表示第1个参数,$2表示第2个参数,...,$9表示第9个参数。如果参数个数多于9个,必须如下表示变量:${},${},...
  1. for((count = ; count <= $; count++))
  2. do
  3. echo The number is $count.
  4. done
  5.  
  6. echo $1, $2, $10, $15

2 读取程序名

  1. 首先想到的是利用$,但是$0获取的文件名包括./以及路径等前缀信息,如下:
  1. echo The command entered is: $
  2. # 运行:./
  3. # 输出:The command entered is: ./.sh
  1. 如果想仅得到文件名,而不包含./,可以使用basename命令:
  1. name=`basename $`
  2. echo The command entered is: $name
  3. # 运行:./
  4. # 输出:The command entered is: .sh

3 特殊变量

  1. $#表示命令行参数的个数:
  1. params=$#
  2.  
  3. echo The number of params is: $params
  4. for((i = ; i <= params; i++))
  5. do
  6. echo The param is: $i
  7. done
  1. 那么很自然地,${$#}表示最后一个变量的值,如下程序:
  1. params=$#
  2. echo The number of params is: $params
  3. echo The last parameter is: ${$#}

  1. 这是怎么回事呢?原来在花括号内不能使用$符号,而是以!来代替$工作:
  1. params=$#
  2. echo The number of params is: $params
  3. echo The last parameter is: ${!#}

  1. 如果想获取所有的参数,当然可以利用$#和循环逐个遍历。也可以利用如下两个特殊变量:$*将所有的命令行参数看作一个整体存储,而$@将命令行中以空格间隔的参数单独存储,如下:
  1. count=
  2. for param in "$*"
  3. do
  4. echo "\$* parameter $count = $param"
  5. count=$[ $count + ]
  6. done
  7.  
  8. count=
  9. for param in "$@"
  10. do
  11. echo "\$@ parameter $count = $param"
  12. count=$[ $count + ]
  13. done

4 移动变量命令shift

  1. shift命令用于将后一个变量的值移到前一个变量上,即$3的值移到$2$2的值移到$1$1的值被删除。
  2. 注:变量$0的值不会被替换。该命令可以使得在不需要知道有多少个参数的情况下即可遍历所有参数:
  1. count=
  2. while [ -n "$1" ]
  3. do
  4. echo "parameter $count = $1"
  5. count=$[ $count + ]
  6. shift
  7. done

注:使用shift命令移除的参数值是无法恢复的,也可以使用shift移到多位,如:shift 2。

操作命令行选项

1 查找选项

可以判断命令行参数是否存在有效选项:

  1. #! /bin/bash
  2. # extracting command line options as parameters
  3.  
  4. while [ -n "$1" ]
  5. do
  6. case "$1" in
  7. -a)
  8. echo "found the -a option";;
  9. -b)
  10. echo "found the -b option";;
  11. -c)
  12. echo "found the -c option";;
  13. *)
  14. echo "$1 is not an option";;
  15. esac
  16. shift
  17. done

在Linux中,命令行选项和参数的分离使用--符号,shell将--前边的参数作为选项来处理。如下脚本可以有效地分离出选项和参数:

  1. #! /bin/bash
  2. # extracting command line options as parameters
  3.  
  4. while [ -n "$1" ]
  5. do
  6.   case "$1" in
  7.   -a)
  8.     echo "found the -a option";;
  9.   -b)
  10.     echo "found the -b option";;
  11.   -c)
  12.     echo "found the -c option";;
  13.   --)
  14.     break;;
  15.   *)
  16.     echo "$1 is not an option";;
  17.   esac
  18.   shift
  19. done
  20.  
  21. shift # 确保跳出while循环后,将--符号移除掉
  22. count=
  23. for param in $@
  24. do
  25. echo "parameter $count: $param"
  26. count=$[ $count + ]
  27. done

如何处理带有参数值的选项呢?比如,./22.sh -a -b benxin -c -d

  1. #! /bin/bash
  2. # extracting command line options as parameters
  3.  
  4. while [ -n "$1" ]
  5. do
  6. case "$1" in
  7. -a)
  8. echo "found the -a option";;
  9. -b)
  10. param="$2"
  11. echo "found the -b option with parameter value $param"
  12. shift ;;
  13. -c)
  14. echo "found the -c option";;
  15. --)
  16. shift
  17. break;;
  18. *)
  19. echo "$1 is not an option";;
  20. esac
  21. shift
  22. done
  23.  
  24. count=
  25. for param in "$@"
  26. do
  27. echo "parameter $count: $param"
  28. count=$[ $count + ]
  29. done

合并选项时可以使用getopt命令,格式如下:

getopt options optstring parameters

options定义了命令行中有效的选项字母以及哪些选项字母需要附加参数值等(在需要附加参数值的选项字母后加一个冒号),如getopt ab:cd -a -b benxin -cd tuzi benxintuzi,optstring定义了4个有效字母:a、b、c、d,并且说明了选项b需要附带参数值。getopt命令自动将-cd拆分成-c和-d两个选项,并且用双破折号--隔开命令行中的额外参数。

2 选项的标准化约定

选项

说明

-a

显示所有对象

-c

生成一个计数

-d

指定一个目录

-e

扩展一个对象

-f

指定输入文件

-h

显示命令帮助

-i

忽略文本大小写

-l

产生输出的长格式版本

-n

使用非交互模式(批量)

-o

指定输出文件

-q

以安静模式运行

-r

递归处理目录或文件

-s

以安静模式运行

-v

生成详细输出

-x

排除某个对象

-y

对所有问题回答yes

操作键盘输入

1 基本的读取

read命令接受从键盘或文件描述符中的输入数据,将其存储到一个指定变量中。使用-p选项可以指定输入提示信息,如下所示:

  1. #! /bin/bash
  2. # testing the read option
  3.  
  4. read -p "Please enter your name: " name
  5. echo "Hello $name."

read命令中,可以根据需要将输入的数据保存在多个变量中,如果指定的变量比较少,那么最后一个变量将包含余下的所有输入,如下所示:

  1. #! /bin/bash
  2. # testing the read option
  3.  
  4. read -p "Enter the values: " val1 val2 val3
  5. echo "$val1"
  6. echo "$val2"
  7. echo "$val3"

注:如果使用read命令时不指定变量,那么read将其接收的任何数据都放到环境变量REPLY中。

2 输入超时

使用read命令时,脚本会一直等待用户输入数据,如果想设置等待时间,使用-t选项即可指定一个计时器,当计时器超时后,read命令会返回一个非零状态码。

  1. if read -t -p "Please enter your name: " name
  2. then
  3. echo "Hello $name."
  4. else
  5. echo
  6. echo "Sorry, too slow"
  7. fi

3 隐藏输入显示

当输入敏感信息时,比如密码,不希望显示在屏幕上,那么可以使用read的-s选项,-s选项的功能是将输入文本颜色设置为与背景色一样:

  1. #! /bin/bash
  2. # testing the read option
  3.  
  4. read -s -p "Enter your password: " passwd
  5. echo
  6. echo "Is your password really $passwd?"

4 从文件中读取

read每次从文件中读取一行数据,当文件中没有数据时,read命令返回非零状态码。最常见的方法是将cat命令运行后的结果通过管道传给含有read的while语句,如下:

  1. #! /bin/bash
  2. # testing the read option
  3.  
  4. count=
  5. cat .sh | while read line
  6. do
  7. echo "Line $count: $line"
  8. count=$[ $count + ]
  9. done
  10.  
  11. echo "Finished processing the file"

shell 与用户交互的更多相关文章

  1. shell脚本0——”一切皆文件“, 认识Shell

    一.”一切皆文件“与“管道” 1)管道:grep foo /path/to/file | grep -n -k 3 | more 实际过程与我们直观认为的相反,最好通过实际过程理解.首先运行的是mor ...

  2. adb shell 查看当前与用户交互的 activity

    adb shell dumpsys activity activities | grep mActivityComponent

  3. shell笔记

    shell:俗称操作系统的"外壳",就是命令解释程序.     是用户与Linux内核之间的接口.     是负责与用户交互,分析.执行用户输入的命令,并给出结果或出错提示.    ...

  4. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  5. 终端、shell、bash的区别联系

    最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是S ...

  6. 【Linux】Shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  7. Shell 常见理论问答

    (1)shell脚本中,怎么可以把某一行注释掉? 答:“#”. (2)如何执行一个shell脚本呢? 答:“sh x.sh”,“加执行./x.sh”,“bash x.sh”. (3)为了方便管理我们约 ...

  8. Linux下的shell与make

    Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...

  9. Shell编程-01-Shell脚本初步入门

    目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell     简单来说Shell其实就是一个命令 ...

随机推荐

  1. android 控件描边取消重叠

    今天写组件的时候用到了描边.可是两个组件放在一起时,描边会变重叠,使之变粗.就不是很美观了. 如何取消呢?网上查了好久没找到,然后就自己试了试,找到了解决方法,就在此记录一下,防止以后忘记. 很简单分 ...

  2. IE CSS HACK

    IE 属性值 HACK .test { background:blue; /*所有浏览器*/ background:yellow\9; /*所有IE浏览器*/ background:green\0; ...

  3. 使用c#数据库连接池

    摘自: http://www.wxphp.com/wxd_0fetn2bw2548fsc2ak8h_1.html 导读:使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成,必须与 ...

  4. 轻松入门React和Webpack

    最近在学习React.js,之前都是直接用最原生的方式去写React代码,发现组织起来特别麻烦,之前听人说用Webpack组织React组件得心应手,就花了点时间学习了一下,收获颇丰 <!-- ...

  5. Windows Phone 显示长文本

    文采不好,将就着看,见谅 思路最重要,故本文不提供源码下载 参考项目: http://www.windowsphone.com/zh-cn/store/app/%E5%BF%83%E7%90%86fm ...

  6. 登陆peoplesoft的时候显示信息

    Signon Event Message Select selectPeopleTools, then selectUtilities, then selectAdministration, then ...

  7. Linux下mysql编译安装

    一.下载安装包 因为编译安装mysql需要cmake所以先编译安装cmake,这里都一起下载下来 下载cmake,网址https://cmake.org/download/ 下载mysql,网址htt ...

  8. angularJS通过post方法下载excel文件

    最近工作中遇到,要使用angularJS的post方法来下载excel的情况.网上找到一个帖子:http://stackoverflow.com/questions/22447952/angularj ...

  9. 【原】简述使用spark集群模式运行程序

    本文前提是已经正确安装好scala,sbt以及spark了   简述将程序挂载到集群上运行的步骤: 1.构建sbt标准的项目工程结构: 其中: ~/build.sbt文件用来配置项目的基本信息(项目名 ...

  10. Remoting,OData Snippet Compiler等

    http://www.sliver.com/dotnet/SnippetCompiler/ [ASP.NET Web API教程]ASP.NET Web API系列教程目录 张逸 .Net Remot ...