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其实就是一个命令 ...
随机推荐
- 堆栈的实现(c语言)
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define EmptyTOS (-1) ...
- 嵌入在C++程序中的extern "C"
1.extern的作用 extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,可以告知编译器,用extern声明的函数和变量可以在本模块或其它模块中使用. 通常,在模块的头文件中 ...
- jQuery 遍历 - map() 方法
定义和用法 map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象. 例子1: 构建表单中所有值的列表: <p><b>value为: &l ...
- Oracle小数点格式化
1. select to_char(123456789.12345,'fm999999990.99') from dual; 如果fm后位数不足则会显示 ## select to_char(12345 ...
- IIS7 配置URL_REWRITE
webconfig 文件 system.webServer节点下配置rewrite 报错 是因为需要安装URL重写 需要安装: https://www.microsoft.com/zh-cn/down ...
- .NET中使用log4net
一,加载log4net引用 下载log4net.dll,我们这里使用的是.NET2.0 下载地址:http://files.cnblogs.com/gosky/log4net-1.2.13-bin-n ...
- 【SMS】移动短信网关返回信息状态代码说明【China Mobile】
1 由SMSC返回的一般结果状态报告 含义 说明 处理建议DELIVRD 消息发送成功 用户成功接收到短信 ??EXPIRED 因为用户长时间关机或者不在服务区等导致的短消息超时没有递交到用户手机上 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(四)-- Middleware
本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Middleware功能支持. 在演示Middleware功能之前,先要了解一下Asp ...
- PHP总结
1.PHP的简介: PHP(外文名:PHP: Hypertext Preprocessor,中文名:"超文本预处理器") 是一种通用开源脚本语言.语法吸收了C语言.Java和Per ...
- Overview Of Portal Registry And Content References
Portal Registry Each portal is defined by a portal registry.A portal registry has a tree-like struc ...
echo $1, $2, $10, $15









