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其实就是一个命令 ...
随机推荐
- 电脑U盘启动总结
1:联想G410(笔记本) FN+F2:进入BIOS,FN+F12,快速启动选择. boot mode—>Legacy support,boot priority—>Legacy firs ...
- java实现身份证校验
原文来自:java教程网 题目:身份证校验 身份证校验 如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以! 因为有人的身份证最后一位是"X" 实 ...
- 建立交叉编译环境(arm-linux-gcc)
linux系统内核版本:2.6.32-358.el6.x86_64(在64位系统上安装32位程序需要另外安装一些库) arm-linux-gcc版本:本文安装的是友善之臂tiny6410光盘中自带的a ...
- 空间session失效的解决方法
今天访问自己的网站的时候(by thinkphp),突然发现身份验证失效了,Session无法跨页,而且登陆的时候总是提示验证码错误(验证码也是通过Session传递的),才意识到可能是Session ...
- jquery 读取xml
<script type="text/javascript" src="jquery/jquery-1.11.3.min.js"></scri ...
- POJ C++程序设计 编程题#4 字符串操作
编程题#4: 字符串操作 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 给 ...
- css半透明
filter:alpha(opacity=80); /*支持 IE 浏览器*/-moz-opacity:0.80; /*支持 FireFox 浏览器*/opacity:0.80; /*支持 Chrom ...
- 【转】src与href属性的区别
ref:http://www.jb51.net/web/77258.html src和href之间存在区别,能混淆使用.src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src是 ...
- Win7下安装IEWebControls.msi
编写人:CC阿爸 2014-2-22 IEWebControls.msi是发布在.net 1.1时代.微软为弥布.net控件的不足而发布一组控件.很多程序猿都喜欢用到他. 方法一: 首先保证IIS7安 ...
- PHP生成随机字符串包括大小写字母
PHP生成随机字符串包括大小写字母,这里介绍两种方法: 第一种:利用字符串函数操作 <?php /** *@blog <www.phpddt.com> */ function cre ...
echo $1, $2, $10, $15









