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

操作命令行参数

1 读取参数

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

2 读取程序名

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

3 特殊变量

$#表示命令行参数的个数:
params=$#

echo The number of params is: $params
for((i = ; i <= params; i++))
do
echo The param is: $i
done
那么很自然地,${$#}表示最后一个变量的值,如下程序:
params=$#
echo The number of params is: $params
echo The last parameter is: ${$#}

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

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

4 移动变量命令shift

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

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

操作命令行选项

1 查找选项

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

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
case "$1" in
-a)
echo "found the -a option";;
-b)
echo "found the -b option";;
-c)
echo "found the -c option";;
*)
echo "$1 is not an option";;
esac
shift
done

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

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
  case "$1" in
  -a)
    echo "found the -a option";;
  -b)
    echo "found the -b option";;
  -c)
    echo "found the -c option";;
  --)
    break;;
  *)
    echo "$1 is not an option";;
  esac
  shift
done shift # 确保跳出while循环后,将--符号移除掉
count=
for param in $@
do
echo "parameter $count: $param"
count=$[ $count + ]
done

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

#! /bin/bash
# extracting command line options as parameters while [ -n "$1" ]
do
case "$1" in
-a)
echo "found the -a option";;
-b)
param="$2"
echo "found the -b option with parameter value $param"
shift ;;
-c)
echo "found the -c option";;
--)
shift
break;;
*)
echo "$1 is not an option";;
esac
shift
done count=
for param in "$@"
do
echo "parameter $count: $param"
count=$[ $count + ]
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选项可以指定输入提示信息,如下所示:

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

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

#! /bin/bash
# testing the read option read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"

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

2 输入超时

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

if read -t  -p "Please enter your name: " name
then
echo "Hello $name."
else
echo
echo "Sorry, too slow"
fi

3 隐藏输入显示

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

#! /bin/bash
# testing the read option read -s -p "Enter your password: " passwd
echo
echo "Is your password really $passwd?"

4 从文件中读取

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

#! /bin/bash
# testing the read option count=
cat .sh | while read line
do
echo "Line $count: $line"
count=$[ $count + ]
done 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. Push failed: Failed with error: fatal: Could not read from remote repository.

    GitLab push远端,出现错误提示:Push failed: Failed with error: fatal: Could not read from remote repository. 原 ...

  2. node.js 包教不包会 (Windows版详解)

    针对@alsotang 的新手入门教程 https://github.com/alsotang/node-lessons ,详解该教程在Windows中的实践,包括博主在实践过程中遇到的问题及解决方案 ...

  3. android 3D旋转效果实现

    一说到3D,可能第一反应就是使用OpenGL ES....但是,实现这么个小功能,要动用这玩意,莫名的恐惧啊!!!!至今也没弄明白这个怎么玩... 好吧,幸亏还有个Camera类可以帮助我们,据说底层 ...

  4. CLRS:sorting in linear time O(n)

    //intput array A,output array result.   count array count . //all the elements is in te range of 0~k ...

  5. Windows Server 2008 R2 配置Exchange 2010邮件服务器

    windows server 服务器系统搭建邮件服务器一般两种情况: 1:Winmail server 软件 2:Exchange 参考教程:http://www.cnblogs.com/zhongw ...

  6. [Cocos2d-x for WP8学习笔记] HelloWorld

    Cocos2d-x 是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,基于Cocos2d-iphone,支持 WOPhone, iOS 4.1, Android 2. ...

  7. c# 数据库操作学习

    一. 如何处理数据库连接 1. 数据库连接可以分为“物理连接”和“逻辑连接”(默认使用连接池的情况下Pooling=true): 物理连接:创建数据库连接时,默认会有一定数量的物理连接(默认Min P ...

  8. SQL中补0

     SQL中补0 编写人:CC阿爸 2014-3-14 第一种方法: right('00000'+cast(@count as varchar),5) 其中'00000'的个数为right函数的最后参数 ...

  9. jQuery中ajax调用当前页面方法

    $.ajax({ type: 'POST', url: 'AddressManager.aspx/GetProvince',//AddressManager.aspx当前页面 data: '{cach ...

  10. encodeURIComponent编码后java后台的解码

    解决方法一: JavaScript: window.self.location="searchbytext.action?searchtext="+encodeURICompone ...