1、使用命令行参数

在shell执行的时候命令行中输入的所有参数可以赋值给一些特殊变量,这些变量成为位置变量参数。

包括:

$0返回脚本名称、$1为第一个参数、$2为第二个参数 ...$9第九个参数
在变量到9个之后,必须使用大括号将变量括起来
${10}第十个参数
$#是获取传入的参数数量
$*是获取所有参数
$@和$*类似 案例
[root@hzy sbin]# sh crname.sh a b c
脚本的名字是:crname.sh
脚本的参数1:a
脚本的参数2:b
脚本的参数3:c
脚本的参数4:
--------------------------------一共有:3个参数
脚本的参数1:a b c
--------------------------------$@和*的区别
脚本的参数1:a
脚本的参数2:b
脚本的参数3:c
[root@hzy sbin]# cat crname.sh
#!/bin/bash
echo 脚本的名字是:$0
echo 脚本的参数1:$1
echo 脚本的参数2:$2
echo 脚本的参数3:$3
echo 脚本的参数4:$4
sleep 5 vv=1
for i in "$*"
do
echo --------------------------------一共有:$#个参数
echo "脚本的参数$vv:$i"
vv=$[ $vv + 1 ]
done sleep 2
v=1
echo --------------------------------\$@和\*的区别
for i in "$@"
do
echo "脚本的参数$v:$i"
v=$[ $v + 1 ]
done 总结--$*和$@在同样可以获取所有传入的参数,但是$*会把参数当成一个整体,而$@则不会。

shift命令

使用shift命令能够改变命令行参数的相对位置

实例
[root@hzy sbin]# sh shift.sh a b c d e
第一个参数:a和所有参个数:5
第一个参数:b和所有参个数:4
第一个参数:c和所有参个数:3
第一个参数:d和所有参个数:2
第一个参数:e和所有参个数:1
[root@hzy sbin]# cat shift.sh
#!/bin/bash
while [ -n "$*" ]
do
echo "第一个参数:$1和所有参个数:$#"
shift
done

2、设置选项

2.1 处理选项

处理一些简单选项

使用case命令
[root@hzy sbin]# sh case.sh -c
选项-c
[root@hzy sbin]# cat case.sh
#!/bin/bash
while [ -n "$1" ];do
case $1 in
-d)echo 选项-d ;;
-c)echo 选项-c ;;
-a)echo 选项-a ;;
*) echo 其他 ;;
esac
shift
done
这里设置shift命令让shell解释$1移位后$0的值,就会退出循环

2.2 getopts命令的用法

getopts和getopt功能相似但又不完全相同,其中getopt是独立的可执行文件,而getopts是由Bash内置的。

getopts命令使用的是俩个环境变量:
OPTARG-中包含需要参数值的选项要使用的值
OPTIND-中包含的值表示getopts停止处理时在参数列表中的位置 先来看看参数传递的典型用法: * ./test.sh -a -b -c : 短选项,各选项不需参数
* ./test.sh -abc : 短选项,和上一种方法的效果一样,只是将所有的选项写在一起。
* ./test.sh -a args -b -c :短选项,其中-a需要参数,而-b -c不需参数。
* ./test.sh --a-long=args --b-long :长选项
貌似getopts不支持长选项 案例1
[root@hzy sbin]# sh getopt.sh -ab test1 -c -f
-a
-b ----whit vale test1
-c
-?,whit vale f
[root@hzy sbin]# cat getopt.sh
#!/bin/bash
while getopts :ab:c opt
do
case "$opt" in
a) echo -a
;;
b) echo -b ----whit vale $OPTARG
;;
c) echo -c
;;
?) echo -?,whit vale $OPTARG
;;
esac
done 案例2
[root@hzy sbin]# sh getopt.sh -ab test -c -f
-a
-b ----whit vale test
-c
-?,whit vale 5
[root@hzy sbin]# cat getopt.sh
#!/bin/bash
while getopts :ab:c opt
do
case "$opt" in
a) echo -a
;;
b) echo -b ----whit vale $OPTARG
;;
c) echo -c
;;
?) echo -?,whit vale $OPTIND
;;
esac
done

3、获取用户输入

有时脚本在执行过程中需要询问一个问题并等待执行脚本人员的应答时,bash shell提供的read命令可以解决这个问题。

案例1
[root@hzy sbin]# cat test.sh
#!/bin/bash
echo 输入c/C显示cpu负载
echo 输入m/M显示内存大小
echo 输入p/P查看磁盘读写 for i in `seq 1 10 `;
do
echo "循环10次,这是第$i次";
read pattion
echo "---------------------------------------------------------" case $pattion in
c | C)
uptime
;;
m | M)
free
;;
P | p)
sar
;;
*)
echo "请输入c/m/p查看"
esac
done > cmp.txt
[root@hzy sbin]# cat cmp.txt
循环10次,这是第1次
---------------------------------------------------------
Linux 3.10.0-862.14.4.el7.x86_64 (hzy) 2018年10月06日 _x86_64_ (2 CPU) 02时36分56秒 LINUX RESTART 02时40分01秒 CPU %user %nice %system %iowait %steal %idle
02时50分02秒 all 0.05 0.00 0.11 0.05 0.00 99.79
03时00分01秒 all 1.85 0.01 2.71 1.10 0.00 94.34
...
平均时间: all 0.09 0.00 0.15 0.10 0.00 99.66
循环10次,这是第2次
---------------------------------------------------------
total used free shared buff/cache available
Mem: 4028400 1094528 1768200 15388 1165672 2548276
Swap: 2097148 0 2097148
循环10次,这是第3次
---------------------------------------------------------
15:55:58 up 13:19, 5 users, load average: 0.04, 0.03, 0.05
循环10次,这是第4次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第5次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第6次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第7次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第8次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第9次
---------------------------------------------------------
请输入c/m/p查看
循环10次,这是第10次
---------------------------------------------------------
请输入c/m/p查看 案例2
使用计时-t指定read命令等待输入的时间。当计时器数值满了时,read命令返回一个非零的状态:
[root@hzy sbin]# cat test.sh
#!/bin/bash
echo 输入c/C显示cpu负载
echo 输入m/M显示内存大小
echo 输入p/P查看磁盘读写 for i in `seq 1 10 `;
do
echo "循环10次,这是第$i次";
if read -t 5 pattion ;then
echo "5秒内输入个参数:$pattion"
else
pattion=c
echo "输出默认值:"
fi
echo "---------------------------------------------------------" case $pattion in
c | C)
uptime
;;
m | M)
free
;;
P | p)
sar
;;
*)
echo "请输入c/m/p查看"
esac
done > uer.txt [root@hzy sbin]# cat uer.txt
循环10次,这是第1次
5秒内输入个参数:p
---------------------------------------------------------
Linux 3.10.0-862.14.4.el7.x86_64 (hzy) 2018年10月08日 _x86_64_ (2 CPU) 00时00分01秒 CPU %user %nice %system %iowait %steal %idle
00时10分01秒 all 0.03 0.00 0.09 0.01 0.00 99.88
00时20分01秒 all 0.03 0.00 0.08 0.00 0.00 99.89
00时30分01秒 all 0.02 0.00 0.07 0.00 0.00 99.91
00时40分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
00时50分01秒 all 0.04 0.00 0.10 0.13 0.00 99.73
01时00分01秒 all 0.03 0.00 0.09 0.00 0.00 99.88
01时10分01秒 all 0.04 0.00 0.09 0.28 0.00 99.59
01时20分01秒 all 0.03 0.00 0.08 0.19 0.00 99.70
01时30分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
01时40分01秒 all 0.03 0.00 0.07 0.16 0.00 99.74
01时50分01秒 all 0.03 0.00 0.08 0.21 0.00 99.67
02时00分01秒 all 0.03 0.00 0.07 0.17 0.00 99.74
平均时间: all 0.03 0.00 0.08 0.10 0.00 99.79 02时53分00秒 LINUX RESTART 03时00分01秒 CPU %user %nice %system %iowait %steal %idle
03时10分01秒 all 0.05 0.00 0.18 0.08 0.00 99.69
平均时间: all 0.05 0.00 0.18 0.08 0.00 99.69
循环10次,这是第2次
5秒内输入个参数:c
---------------------------------------------------------
03:13:59 up 21 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第3次
5秒内输入个参数:m
---------------------------------------------------------
total used free shared buff/cache available
Mem: 4028400 934216 2329896 15292 764288 2742908
Swap: 2097148 0 2097148
循环10次,这是第4次
输出默认值:
---------------------------------------------------------
03:14:06 up 21 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第5次
5秒内输入个参数:p
---------------------------------------------------------
Linux 3.10.0-862.14.4.el7.x86_64 (hzy) 2018年10月08日 _x86_64_ (2 CPU) 00时00分01秒 CPU %user %nice %system %iowait %steal %idle
00时10分01秒 all 0.03 0.00 0.09 0.01 0.00 99.88
00时20分01秒 all 0.03 0.00 0.08 0.00 0.00 99.89
00时30分01秒 all 0.02 0.00 0.07 0.00 0.00 99.91
00时40分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
00时50分01秒 all 0.04 0.00 0.10 0.13 0.00 99.73
01时00分01秒 all 0.03 0.00 0.09 0.00 0.00 99.88
01时10分01秒 all 0.04 0.00 0.09 0.28 0.00 99.59
01时20分01秒 all 0.03 0.00 0.08 0.19 0.00 99.70
01时30分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
01时40分01秒 all 0.03 0.00 0.07 0.16 0.00 99.74
01时50分01秒 all 0.03 0.00 0.08 0.21 0.00 99.67
02时00分01秒 all 0.03 0.00 0.07 0.17 0.00 99.74
平均时间: all 0.03 0.00 0.08 0.10 0.00 99.79 02时53分00秒 LINUX RESTART 03时00分01秒 CPU %user %nice %system %iowait %steal %idle
03时10分01秒 all 0.05 0.00 0.18 0.08 0.00 99.69
平均时间: all 0.05 0.00 0.18 0.08 0.00 99.69
循环10次,这是第6次
输出默认值:
---------------------------------------------------------
03:14:16 up 21 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第7次
5秒内输入个参数:c
---------------------------------------------------------
03:14:19 up 21 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第8次
输出默认值:
---------------------------------------------------------
03:14:24 up 22 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第9次
输出默认值:
---------------------------------------------------------
03:14:29 up 22 min, 4 users, load average: 0.00, 0.03, 0.11
循环10次,这是第10次
5秒内输入个参数:
---------------------------------------------------------
请输入c/m/p查看

4、读取文件

同样利用read命令可以读取linux系统中的文件数据,每次调用一次read命令,都会读取文件中的一行文本。

[root@hzy sbin]# vim read.sh
[root@hzy sbin]# sh read.sh
line 1:循环10次,这是第1次
line 2:5秒内输入个参数:p
line 3:---------------------------------------------------------
line 4:Linux 3.10.0-862.14.4.el7.x86_64 (hzy) 2018年10月08日 _x86_64_ (2 CPU)
line 5:
line 6:00时00分01秒 CPU %user %nice %system %iowait %steal %idle
line 7:00时10分01秒 all 0.03 0.00 0.09 0.01 0.00 99.88
line 8:00时20分01秒 all 0.03 0.00 0.08 0.00 0.00 99.89
line 9:00时30分01秒 all 0.02 0.00 0.07 0.00 0.00 99.91
line 10:00时40分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
line 11:00时50分01秒 all 0.04 0.00 0.10 0.13 0.00 99.73
line 12:01时00分01秒 all 0.03 0.00 0.09 0.00 0.00 99.88
line 13:01时10分01秒 all 0.04 0.00 0.09 0.28 0.00 99.59
line 14:01时20分01秒 all 0.03 0.00 0.08 0.19 0.00 99.70
line 15:01时30分01秒 all 0.03 0.00 0.07 0.00 0.00 99.90
line 16:01时40分01秒 all 0.03 0.00 0.07 0.16 0.00 99.74
line 17:01时50分01秒 all 0.03 0.00 0.08 0.21 0.00 99.67
line 18:02时00分01秒 all 0.03 0.00 0.07 0.17 0.00 99.74
line 19:平均时间: all 0.03 0.00 0.08 0.10 0.00 99.79
line 20:
line 21:02时53分00秒 LINUX RESTART
line 22:
line 23:03时00分01秒 CPU %user %nice %system %iowait %steal %idle
^C------------------
[root@hzy sbin]# cat read.sh
#!/bin/bash
count=1
cat uer.txt | while read line
do
echo "line $count:$line"
count=$[ $count + 1 ]
sleep 1
done
echo ------------------

简书链接

shell中处理用户输入的更多相关文章

  1. java中取得用户输入的方法

    java中取得用户输入的方法 1.采用java.util.Scanner类 采用Scannerd的next()方法读取,测试代码如下: Scanner sc=new Scanner(System.in ...

  2. shell初级-----处理用户输入

    命令行参数 读取参数 位置参数变量是标准的数字:$0是程序名,$1是第一个参数,$2,是第二个参数,直到第九个参数$9. 特殊的变量:$#表示参数个数,$?表示最后运行的命令的结束代码(返回值) 每个 ...

  3. Linux&shell之处理用户输入

    写在前面:案例.常用.归类.解释说明.(By Jim) 命令行参数$1为第一个参数,$2为第二个参数,依次类推...示例: #!/bin/bash # using one command line p ...

  4. Linux - 简明Shell编程13 - 用户输入(UserInput)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 1 - arguments #!/bin/bash i ...

  5. Shell - 简明Shell入门13 - 用户输入(UserInput)

    示例脚本及注释 1 - arguments #!/bin/bash if [ -n "$1" ];then # 验证参数是否传入 echo "The first para ...

  6. 9 在C#控制台程序(console)中让用户输入

    经过前面那些练习,我们已经熟悉录入一些简单的代码.这些代码可以进行一些简单的运算,在dos窗口打印出一些东西出来.我们现在要开始学习如何把数据从外部输入到我们的程序中. 其实大多数程序的工作是完成下面 ...

  7. 8、JAVA中的用户输入(I/0交互过程)

    这里在数组的学习中用到了用户输入,也就是交互模式,日常的数据,不可能每一次都是程序员定义好的,终究需要用户与程序之间进行交互,机器等待用户输入,用户通过键盘输入所需数据(数据包括,字符,字串,数值等) ...

  8. Shell编程中的用户输入处理

    Linux read命令用于从标准输入读取数值. read 内部命令被用来从标准输入读取单行数据.这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据. 语法 read [-er ...

  9. Shell 脚本处理用户输入

    传递参数 跟踪参数 移动变量 处理选项 将选项标准化 获得用户的输入 bash shell提供了一些不同的方法来从用户处获取数据,包括命令行参数(添加在命令后数据),命令行选项(可以修改命令行为的单个 ...

随机推荐

  1. LeetCode 190. Reverse Bits (算32次即可)

    题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...

  2. PostgreSQL 事务管理的MVCC

    PostgreSQL的并发控制机制同时实现了多版本控制MVCC协议和两阶段封锁协议.实际采用哪种协议取决于所执行的语句类型. DML语句的并发控制将使用MVCC协议: DDL语句的并发控制基于标准的两 ...

  3. 洛谷P4016 负载平衡问题 费用流

    这道题还是很好的. 考察了选手对网络流的理解. 首先,任意两个相邻点之间的运货量时没有限制的. 我们可以将相邻点之间的流量建为无限大,单位费用设为 1,代表运输一个货物需耗费一个代价. 由于题目要求最 ...

  4. Node_进阶_5

    Node进阶第五天 为什么mysql不用开mongod –dbpath xx… 答:因为mysql会在”服务”中运行,也就是开机时自动启动并且长久驻扎在内存中了. mongodb其实也能通过设置来设成 ...

  5. Shiro结合Spring boot开发权限管理系统

    前一篇文章说了,我从开始工作就想有一个属于自己的博客系统,当然了,我想的是多用户的博客,大家都可以发文章记笔记,我最初的想法就是这样. 博客系统搭建需要使用的技术: 1.基于Spring boot 2 ...

  6. 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码

    入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...

  7. caioj 1158 欧拉函数

    直接套模板,这道题貌似单独求还快一些 解法一 #include<cstdio> #include<cctype> #define REP(i, a, b) for(int i ...

  8. 紫书 习题 8-23 UVa 1623 (set妙用 + 贪心)

    这道题我是从样例中看出思路了 2 4 0 0 1 1 看这组数据, 输出的是No, 为什么呢?因为两个1之间没有神龙喝水, 所以一定会有水灾. 然后就启发了我,两次同一个湖的降水之间必须至少有一次神龙 ...

  9. 紫书 例题8-16 UVa 1608 (递归)

    题意: 判断所给序列是否满足任意连续子序列中至少有一个出现一次的元素. 思路:在整体中找到一个只出现一次的元素, 然后在递归两边.因为两边的序列中有这个数那就满足要求, 所以就看剩下的序列漫步满足要求 ...

  10. Docker学习总结(4)——Docker镜像与容器命令

    Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...