shell中处理用户输入
发布时间:2020-12-15 23:15:38 所属栏目:安全 来源:网络整理
导读:1、使用命令行参数 在shell执行的时候命令行中输入的所有参数可以赋值给一些特殊变量,这些变量成为位置变量参数。 包括: $0返回脚本名称、$1为第一个参数、$2为第二个参数 ...$9第九个参数在变量到9个之后,必须使用大括号将变量括起来${10}第十个参数$#是
1、使用命令行参数 在shell执行的时候命令行中输入的所有参数可以赋值给一些特殊变量,这些变量成为位置变量参数。 包括: $0返回脚本名称、$1为第一个参数、$2为第二个参数 ...$9第九个参数 在变量到9个之后,必须使用大括号将变量括起来 ${10}第十个参数 $#是获取传入的参数数量 $*是获取所有参数 [email?protected]和$*类似 案例 [[email?protected] sbin]# sh crname.sh a b c 脚本的名字是:crname.sh 脚本的参数1:a 脚本的参数2:b 脚本的参数3:c 脚本的参数4: --------------------------------一共有:3个参数 脚本的参数1:a b c [email?protected]和*的区别 脚本的参数1:a 脚本的参数2:b 脚本的参数3:c [[email?protected] 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 --------------------------------[email?protected]和*的区别 for i in "[email?protected]" do echo "脚本的参数$v:$i" v=$[ $v + 1 ] done 总结--$*和[email?protected]在同样可以获取所有传入的参数,但是$*会把参数当成一个整体,而[email?protected]则不会。 shift命令 使用shift命令能够改变命令行参数的相对位置 实例 [[email?protected] sbin]# sh shift.sh a b c d e 第一个参数:a和所有参个数:5 第一个参数:b和所有参个数:4 第一个参数:c和所有参个数:3 第一个参数:d和所有参个数:2 第一个参数:e和所有参个数:1 [[email?protected] sbin]# cat shift.sh #!/bin/bash while [ -n "$*" ] do echo "第一个参数:$1和所有参个数:$#" shift done 2、设置选项 2.1 处理选项 处理一些简单选项 使用case命令 [[email?protected] sbin]# sh case.sh -c 选项-c [[email?protected] 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 [[email?protected] sbin]# sh getopt.sh -ab test1 -c -f -a -b ----whit vale test1 -c -?,whit vale f [[email?protected] 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 [[email?protected] sbin]# sh getopt.sh -ab test -c -f -a -b ----whit vale test -c -?,whit vale 5 [[email?protected] 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 [[email?protected] 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 [[email?protected] 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命令返回一个非零的状态: [[email?protected] 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 [[email?protected] 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.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,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,0.11 循环10次,这是第7次 5秒内输入个参数:c --------------------------------------------------------- 03:14:19 up 21 min,0.11 循环10次,这是第8次 输出默认值: --------------------------------------------------------- 03:14:24 up 22 min,0.11 循环10次,这是第9次 输出默认值: --------------------------------------------------------- 03:14:29 up 22 min,0.11 循环10次,这是第10次 5秒内输入个参数: --------------------------------------------------------- 请输入c/m/p查看 4、读取文件 同样利用read命令可以读取linux系统中的文件数据,每次调用一次read命令,都会读取文件中的一行文本。 [[email?protected] sbin]# vim read.sh [[email?protected] 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------------------ [[email?protected] 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 ------------------ 简书链接 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |