声明:本文参考C语言中文网和Linux命令大全
一、read命令
前面讲过,位置参数变量是可以把用户的输入用参数的方式输入脚本的,不过这种输入方式只有写这个脚本的人才能确定需要输入几个参数,每个参数应该输入什么类型的数据,并不适合普通用户使用。
除位置参数变量外,我们也可以使用 read 命令向脚本中传入数据。read 命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read 命令将数据放入一个标准变量中。
语法
read【选项】【参数】
选项
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒);
-n 字符数:read命令只接收指定的字符数就会执行;
-s: 隐藏输入的数据,适用于机密信息的输入;
变量:指定读取值的变量名
例1
第一步:创建文件read.sh,并赋予相应的权限
第二步:在read.sh中进行编写一下代码
注意:name和“please input your name:”之间要有空格。如果没有,例如下图就不能正确执行
这里稍微解释一下上图每一行的含义
(1)read -t 30 -p "please input your name:"name就是提示please input your name并且等待30秒,用户输入的值保存在name中。
(2)read -s -t 30 -p "please enter your age:"age就是提示please input your age并且等待30秒,注意这个值是隐藏的
(3)read -n 1 -t 30 -p "please select your gender[M/F]:"gender就是提示please select your gender且等待30秒,用户输入的值必须是M或者F
第四步:运行文件
二、数值运算
二、1使用declare声明变量类型
declare命令用于声明和显示已存在的shell变量。declare命令若不带任何参数选项,则会显示所有shell变量及其值。declare的功能与typeset命令的功能是相同的。
语法
declare【选项】【变量名】
选项
-:给变量设定类型属性;
+:取消变量的类型属性;
-a:将变量声明为数组型;
-i:将变量声明为整数型(integer);
-r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性;
-x:将变量声明为环境变量;
-p:显示指定变量的被声明的类型;
例1:数值运算
例2:数组
例3:声明环境变量
二、2 使用expr或let数值运算工具
进行数值运算的第二种方法是使用 exp 命令,这个命令就没有 declare 命令那么复杂了。
语法
expr【选项】【参数】
选项
--help:显示指令的帮助信息;
--version:显示指令版本信息。
参数
表达式:要求值的表达式。
expr常用的运算有加法运算:+减法运算、\*乘法运算、/除法运算、求摸(取余)运算:%
例1:加法运算
可见要进行加法运算=="+"号左右两侧必须有空格,否则运算不执行==,并且expr和变量时间也应该有空格
例2:乘法运算
三、常用运算符
shell中常用的符号运算有
优先级 | 运算符 | 说 明 |
---|---|---|
13 | -,+ | 单目负、单目正 |
12 | !,~ | 逻辑非、按位取反或补码 |
11 | *, /, % | 乘、除、取模 |
10 | +, - | 加、减 |
9 | <<, >> | 按位左移、按位右移 |
8 | <=, >=, <, > | 小于或等于、大于或等于、小于、大于 |
7 | == ,!= | 等于、不等于 |
6 | & | 按位与 |
5 | ^ | 按位异或 |
4 | | | 按位或 |
3 | && | 逻辑与 |
2 | II | 逻辑或 |
1 | =,+=,•=,*=,/=,%=,&=, |=, <<=, >>= | 赋值、运算且赋值 |
注:数值越大优先级越高,具有较高优先级的运算符先于具有较低优先级的运算符进行求值运算
四、变量调试和内容置换
在脚本中,有时需要判断变量是否存在或是否被赋予了值,如果变量已经存在并且被赋予了值,则不改变变量;如果变量不存在或没有被赋值,则赋予其新值。这时我们就可以使用变量测试与内容置换。
我们在脚本中可以使用条件判断语句 if 来替代这种测试方法,不过使用 Shell 自带的变量置换更加方便,但是这种方法容易记混。先来看一下变量置换有哪些方式
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x= 新值 | x 为空 | x=$y |
x=${y:-新值} | x= 新值 | x= 新值 | x=$y |
x=${y+新值} | x 为空 | x= 新值 | x=新值 |
x=${y:+新值} | x 为空 | x 为空 | x=新值 |
x=${y=新值} | x= 新值 | x 为空 | x=$y |
y= 新值 | y 值不变 | y值不变 | |
x=${y:=新值} | x= 新值 | X= 新值 | x=$y |
y= 新值 | y= 新值 | y值不变 | |
x=${y?新值} | 新值输出到标准错误输出(屏幕) | x 为空 | x=$y |
x=${y:?新值} | 新值输出到标准错误输出 | 新值输出到标准错误输出 | x=$y |
看完是不是有点不懂?别急看一下例子你就会理解了
例1
变量置换方式 | 变量y没有设置 | 变量y为空值 | 变量y设置值 |
---|---|---|---|
x=${y-新值} | x= 新值 | x 为空 | x=$y |
这里就是变量y没有设置的情况下x=新值
这里是变量y设置为空值的情况下x=空
这里是变量y设置有值的情况下x=y
注意:
如果大括号内没有":",则变量 y 为空或没有被设置,处理方法是不同的;如果大括号内有":",则变量 y 不论是为空,还是没有被设置,处理方法是一样的。
如果大括号内是"-“或”+",则在改变变量 x 的值的时候,变量 y 的值是不改变的;如果大括号内是"=",则在改变变量 x 的值的同时,变量 y 的值也会改变。
如果大括号内是"?",则当变量 y 不存在或为空时,会把"新值"当成报错输出到屏幕上