14 处理用户输入
1. 脚本与使用者的交互
使用者在运行脚本时,向脚本传递数据,脚本可以通过一些不同的方法来从用户处获取数据:
- 命令行参数(添加在命令后的数据)
- 命令行选项(看修改命令行行为的单个字母)
- 直接从键盘读取
###1.1 命令行参数 ###
如:
./test 20 10(每个参数用空格隔开)
命令行参数可以是数值,也可以使文本字符串;
文本字符串的需要注意的是:当遇到单个文本字符串有空格需要使用单引号或者双引号圈住该字符串,否则shell会将空格当成两个值的分隔符;这里的引号并非数据的一部分,只是表示标识值的起始位置
脚本通过特殊变量来处理命令行参数;在脚本中读取参数:bash shell会将一些称为***位置参数***的特殊变量来接收命令行中的参数,这样包括shell所执行的脚本名;
位置参数变量:
$0:是脚本名
$1:是第一个参数
$2:是第二个参数
以此类推…
这样就可以在脚本中使用使用其他变量一样使用这些特殊变量;
注意:当命令行参数超过9个是,在脚本中使用命令行参数赋值的特殊变量,必须在数字周围加上花括号如:${10}
1.1.1 读取脚本名
前面我们说了可以用$0在脚本中获取脚本名
使用我们前面一直用的./test运行脚本方式,当传给$0变量获取的实际字符串不仅仅是脚本名,而是完整的脚本路径时,$0其实是整个路径;只获取脚本名,就需要剥离路径:
basename命令:返回不含路径的脚本名
basename $0
#!/bin/bash
name=$($basename $0)
echo the script name is $name
结合前面所有的知识点综合练习:
1.1.2 测试参数
注意:使用该种方式运行脚本时,未加命令行参数,可能可能会报错;
在脚本中检查特殊变量是否有值:
-n $1
在bash 中有一些特殊变量,会记录命令行参数;
- 统计命令行中有多少命令行参数:$#(含有运行脚本是携带的命令行参数个数)
-
获取命令行最后一个参数:${!#}
-
抓取命令行参数数据:
(1)、$*将命令行上所有参数当做一个单词保存,视为一个整体
(2)、$@:将所有参数当做同一字符串中的多个独立单词(可以遍历);
1.1.3 移动变量-shift
shift命令用来操作命令行参数,根据他们的相对位置来移动位置,默认情况它会将每个参数向左移动一个位置( n 值 移 动 到 n值移动到 n值移动到n-1,依次类推,$1的值会被删除,$0的值保持不变),这里也就提供了另外一种遍历命令行参数的思路:不断获值取$1的值,不断移动参数,只需要操作第一个参数的值(当其没有参数值时,表示已经遍历完所有命令行参数)
#!/bin/bash
count=1
while [ -n "$1" ]
do
echo "the #$count parameter is $1"
count=$[ $count + 1 ]
shift
done
当然也可以指定一次性移动多个位置:
shift n(数值)
1.2 命令行选项
选项就是是跟在单破折线后的单个字母,它能改变命令的行为;
选项和参数没什么区别,你也可以使用上面的方式来遍历选项;
有时候可能你需要在脚本中同时使用选项和参数的情况,Linux处理这个问题的标准方式是将用特殊字符(–:双破折号表选示项列表结束)将二者隔开;,该字符告诉脚本选项何时结束以及普通参数何时开始;
有的选项可能带值:如 -b test
下面我们就以一个参数、带值选项同时使用的综合例子讲解:
while [ -n "$1" ]
do
case "$1" in
-a) echo "found the -a options" ;;
-b) echo "found the -b options,with the value is $2"
shift;;
--) shift
break;;
*):echo "don't found options";;
esac
shift
done
echo "====the options is over====="
while [ -n "$1" ]
do
echo "the #$count parameter is $1"
count=$[ $count + 1 ]
shift
done
无论是- -号,还是选项、选项值都占一个参数位置,当我们在遍历是带值的选项时,此时$1即为选项,$2毫无疑问表示就是选项值,我们在获取,是需要shift的,这样下一循环遍历才是下一个选项;
上面这种方式有一个缺陷:当我们合并选选项,比如:./test -ac 这种形式将多个选项放进一个参数中就不能工作了;
getopt命令:是一个处理命令行选项和参数是非常方便的工具;
该命令会基于optstring解析提供的参数列表数据;
命令格式:
getopt optstring parameters
-
optstring:定义了命令行有效的选项字母,还定义了哪些字母需要参数值;在每个需要参数值的字母后面加上一个冒号(:)
-
parameters:参数列表
如:
getopt ab:cd -a -b test1 1 -cd 3 4
输出:-a -b test1 -c -d -- 1 3 4
注意:他会自动将-cd选项分成两个选项;
1.2.1 选项标准化
在前面我们说了你完全可以控制用哪些字母选项,以及他们的作用,但在Linux中,的一些字母有某种程度的标准含义,如果我们在使用时也能按照其墨守成规的含义,这样会省去很多查看手册的时间:
1.3 获取用户输入
read命令:从标准输入(键盘)或者另外一个文件描述符中接受输入;在收到输入后,read命令将数据放进一个变量;
语法格式:
read 变量(用于接受输入数据)
- 可以不指定变量,这时输入数据是放进特殊环境变量REPLY中的;
- 我们可以指定多个变量,输入的每一个数据值都会分配给变量列表中的下一个变量,如果变量不够,最后一个变量将接受剩下的所有输入数据;(空格区分每一个输入数据)
- -p选项:允许直接在read命令行指定提示符
- -t:指定用户输入计时器,超时read命令返回一个非零退出状态码
- -n数字:表示接受到指定数字字符,就会自动将其赋值给变量(不用像前面还需输入回车表示输入数据完成)
- -s:隐藏读入的数据,不在屏幕上显示(比如:常见的密码)
如:
read -p "please enter your name:" name
从文件中读数据:
read命令每次从文件中读取一行,当文件中没有数据时,read命令退出返回非零退出状态码(可用于遍历);
:常见的密码)
如:
read -p "please enter your name:" name
[外链图片转存中…(img-Bc6sbaqp-1592379470171)]
从文件中读数据:
read命令每次从文件中读取一行,当文件中没有数据时,read命令退出返回非零退出状态码(可用于遍历);
[外链图片转存中…(img-GJdJ1n21-1592379470172)]