shell 与用户交互
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.
doneecho $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 与用户交互的更多相关文章
- shell脚本0——”一切皆文件“, 认识Shell
一.”一切皆文件“与“管道” 1)管道:grep foo /path/to/file | grep -n -k 3 | more 实际过程与我们直观认为的相反,最好通过实际过程理解.首先运行的是mor ...
- adb shell 查看当前与用户交互的 activity
adb shell dumpsys activity activities | grep mActivityComponent
- shell笔记
shell:俗称操作系统的"外壳",就是命令解释程序. 是用户与Linux内核之间的接口. 是负责与用户交互,分析.执行用户输入的命令,并给出结果或出错提示. ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- 终端、shell、bash的区别联系
最佳答案 终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多. shell,Shell就是用户和操作系统之间的壳,中介,GUI和CLI都算是S ...
- 【Linux】Shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
- Shell 常见理论问答
(1)shell脚本中,怎么可以把某一行注释掉? 答:“#”. (2)如何执行一个shell脚本呢? 答:“sh x.sh”,“加执行./x.sh”,“bash x.sh”. (3)为了方便管理我们约 ...
- Linux下的shell与make
Linux下的shell与make 一.shell 1.1 什么是shell ● 用户与Linux的接口 ● 命令解释器 ● 支持多用户 ● 支持复杂的编程语言 ● Shell有很多种,如:csh,t ...
- Shell编程-01-Shell脚本初步入门
目录 什么是Shell 什么是Shell脚本 Shell脚本语言的种类 常用操作系统默认Shell Shell 脚本的建立和执行 脚本规范 什么是Shell 简单来说Shell其实就是一个命令 ...
随机推荐
- Sql语句直接返回XML文件
通过Sql语句直接返回XML文件 select UserID,UserName,AccountName,LoginPassword from users for xml raw('Users') ,r ...
- java基础回顾(五)——Stack、Heap
栈(stack):是简单的数据结构,但在计算机中使用广泛.栈最显著的特征是:LIFO(Last In, First Out,后进先出).比如我们往箱子里面放衣服,先放入的在最下方,只有拿出后来放入的才 ...
- MFC启动和关闭线程
1. 启动线程: CWinThread* AfxBeginThread( 线程函数,this ); 2.通常导致线程终止的两种情况是:控制函数退出或不允许线程完成运行.如果字处理器使用后台打印线程,若 ...
- js 打开PDF
用插件打开PDF的一个超连接 但是谷歌了很久 ,发现了一个很好的方法 就是借google 来打开一个PDF ,而不下载PDF: _yourID.setAttribute('onclick'," ...
- 【UEditor】远程上传图片到【七牛云存储】
杂谈:最近在玩一个第三方的微信开发平台,里面的图片都是上传到[七牛云存储]的,用了一下非常的好用,支持各种语言,SDK齐全.支持全分布式系统架构以及存储技术和数据加速,于是决定将网站的图片都存储到七牛 ...
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- php-resque学习笔记二(配置)
1:前提 系统:CentOS PHP版本:PHP7 安装目录:/usr/local/php php-resque 安装目录:/home/software/php-resque ...
- c# TextReader/TextWriter 的类
TextReader以及TextWriter这两个类,非常有用,很多方法都接受它们作为参数. TextReader有两个子类: StringReader/StringWriter 用于读取字符串: S ...
- canvas 绘圆加边框
HTML5中canvas元素,绘制圆形需要使用路径,开始时要取得图形上下文,首先使用路径来勾勒图形的轮廓,然后设置颜色,进行绘制. arc(cx,cy,radius,start_angle,end_a ...
- YARN内存使用优化配置
在Hadoop2.0中, YARN负责管理MapReduce中的资源(内存, CPU等)并且将其打包成Container. 这样可以精简MapReduce, 使之专注于其擅长的数据处理任务, 将无需考 ...
echo $1, $2, $10, $15









