Linux笔记10——shell编程基础-4
补充
- $#——取参数个数
- “$n”,有值取值,无值取空字符,一般都会加引号,在某些情况下避免报语法错误
一、read接收键盘输入
[root@localhost ~]# cat demo.sh
#!/bin/bash
echo -n "请输入你的姓名:"
read nameecho "你的名字是:"$name
[root@localhost ~]# bash demo.sh
请输入你的姓名:zhangsan
你的名字是:zhangsan
[root@localhost ~]#
语法:read [选项] [变量名]
- -p:提示信息,在read等待时输入的信息
- -t:秒数,read等待的秒数
- -s:隐藏输入信息
- -n:字符数,read最多能接收的字符数(达标即执行)
实验一:测试各选项的用法
#!/bin/bash
#-p:提示信息
read -p "请输入你的姓名:" name
#-s:隐藏年龄
read -p "请输入你的年龄:" -s age
#-t:输入时间只有10秒
read -p "请输入你的性别:" -t 10 sex
#-n:电话号码最多只能输十一位
read -p "请输入你的电话号码:" -n 11 numberecho "输入你的信息:"$name $age $sex $number
实验二:可以同时接收多个参数,分别放在多个变量里
[root@localhost ~]# cat test2.sh
#!/bin/bash
read -p "请输入你的姓名、性别、年龄、电话号码:" name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:zhangsna man 32 123456789
输入你的信息:zhangsna 32 man 123456789
[root@localhost ~]#
实验三:尝试修改接收参数个数,再看运行效果(某些特殊选项会出现不自动换行的bug,所以这里用echo来换行)
[root@localhost ~]# cat test2.sh
#!/bin/bash
echo "请输入你的姓名、性别、年龄、电话号码:"
read name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:
zhangsan man 32 123456 你好吗?我是谁?
输入你的信息:zhangsan 32 man 123456 你好吗?我是谁?
[root@localhost ~]#
结论:
- 如果只提供了一个变量名,则整个输入全部赋予该变量
- 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值
二、shell常用运算符
1.声明指定类型的变量
注:数值运算需要使用declare声明变量类型
类型分类
- 整数型
- 数组型
- 环境变量
- 只读变量
实验一:查看变量类型
[root@localhost ~]# name=lisi
[root@localhost ~]# declare -p name
declare -- name="lisi"
实验二:整数型(shell中变量默认类型是字符串,两个字符串相加的效果是字符拼接)
[root@localhost ~]# n1=10
[root@localhost ~]# n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20#整型
[root@localhost ~]# declare -i a=100 b=200
[root@localhost ~]# declare -i num=$a+$b
[root@localhost ~]# echo $num
300
注:变量类型——字符串(--)、数值(-i)、数组(-a)
2.命令:declare [+-][选项] [变量]
- -:给变量设置类型
- +:取消变量类型
- -i:将变量声明成整数型
- -a:将变量声明成数组型
- -x:将变量声明成环境变量
- -r:将变量声明成只读
- -p:显示指定变量的类型和内容
注:若使用echo输出数值运算,则输出结果只会是字符串拼接,不是数值运算的结果
#变量n是字符
[root@localhost ~]# declare -i n1=10
[root@localhost ~]# declare -i n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20
#变量n是整型
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
#变量n是整型,n3和n4都是字符串
[root@localhost ~]# n3=10
[root@localhost ~]# n4=20
[root@localhost ~]# n=$n3+$n4
[root@localhost ~]# echo $n
30
即:
- 字符串=数值+数值——字符串的拼接
- 数值=数值+数值——数值的运算
- 数值=字符串+字符串——数值的运算
结论:变量名的类型要更加重要一些
三、数值的运算
方法一:定义一个数值类型的变量作为结果
#定义n为整型,计算n1+n2的值
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
方法二:使用expr进行数值运算
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# expr $x + $y
300
[root@localhost ~]# expr $x * $y
expr: 语法错误:未预期的参数 “anaconda-ks.cfg”
[root@localhost ~]# expr $x \* $y
20000
[root@localhost ~]#
注:运算符左右两端得有空格;乘号需要使用转义符取消特殊含义
方法三:使用let进行数值计算
- 运算符左右不需要空格,但需要声明一个新变量用于接收计算结果
- let还能进行自增减,或指定增加量或减少量
[root@localhost ~]# let he=$x+$y
[root@localhost ~]# echo $he
300
[root@localhost ~]# n=10
[root@localhost ~]# let n++
[root@localhost ~]# echo $n
11
[root@localhost ~]# let n=$n+1
[root@localhost ~]# echo $n
12
[root@localhost ~]# let n+=5
[root@localhost ~]# echo $n
17
[root@localhost ~]#
方法四:使用$(())或$[]进行数值运算
[root@localhost ~]# unset x;unset y
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# echo $(($x+$y))
300
[root@localhost ~]# echo $[$x+$y]
300
补充
#测试运算符的顺序
[root@localhost ~]# echo $((16/5))
3
[root@localhost ~]# echo $((-16/5))
-3
[root@localhost ~]# echo $((-16/-5))
3
[root@localhost ~]# echo $((16/-5))
-3
#a%b,取余结果的符号和a一致
[root@localhost ~]# echo $((16%5))
1
[root@localhost ~]# echo $((-16%5))
-1
[root@localhost ~]# echo $((-16%-5))
-1
#对一个数n取余,余数是有范围的,即[0-(n-1)]
------------
#指定范围的随机数,默认范围是[0,32767]
$ echo $RANDOM
#在0~10之间产生一个随机数
$ echo $(($RANDOM%11))
#在1~100之间产生一个随机数
$ echo $(($RANDOM%100+1))
#表格中的优先级是乘除优先于加减,但是若加减被()调用,则括号内的优先级高于乘除
[root@localhost ~]# n1=$(((11+22)*33/44))
[root@localhost ~]# echo $n1
24
#逻辑与(一般单独使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1
-----------
#shell中处理的数值都是整数类型,若处理小数用bc
5、Shell的环境变量配置
5-1、登录环境变量的配置文件
[root@localhost ~]# yum -y install bc
[root@localhost ~]# echo "2.5+3.5"|bc
6.0
[root@localhost ~]# echo "2.3*3"|bc
6.9
注:$变量名取值;$(命令)取命令的值;$(())取运算表达式的值
四、数组
定义:名=(值1 值2 值3....)
[root@localhost ~]# name=(zhangsan lisi wangwu)
[root@localhost ~]# echo $name #默认情况下只能取第一个值
zhangsan
[root@localhost ~]# echo ${name[1]} #根据下标取值
lisi
--------------
#随机取数值name中的值
[root@localhost ~]# echo ${name[$RANDOM%3]}
zhangsan
或
[root@localhost ~]# echo ${name[$(($RANDOM%3))]}
zhangsan
--------------
[root@localhost ~]# echo ${name[*]}
zhangsan lisi wangwu
[root@localhost ~]# echo ${name[@]}
zhangsan lisi wangwu
--------------
[root@localhost ~]# echo ${#name[@]} #取 值的个数,即数组的长度
3
[root@localhost ~]# echo ${#name[0]} #取的是一个值的字符串长度
8
[root@localhost ~]#
---------------
改:
[root@localhost ~]# name[1]=lisiis
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
增:
[root@localhost ~]# name[3]=laoliu
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu laoliu
删:
[root@localhost ~]# unset name[3]
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
[root@localhost ~]# unset name
[root@localhost ~]# echo ${name[@]}[root@localhost ~]#
五、知识点补充
字符串判断
测试选项 | 作用 |
-z 字符串 | 判断字符串是否为空(为空返回真) |
-n 字符串 | 判断字符串是否为非空(非空返回真) |
字符串1 == 字符串2 | 判断字符串是否相等(相等返回真) |
字符串1 != 字符串2 | 判断字符串是否不相等(不相等返回真) |
练习1:写一个脚本,计算1到100的值
[root@localhost ~]# cat he.sh
#!/bin/bash
n=0
for i in {1..100}
don=`expr $n + $i`
done
echo $nn1=0
for i in {1..100}
dolet n1+=$i
done
echo $n1n2=0
for i in {1..100}
don2=$((n2+=$i))
done
echo $n2
[root@localhost ~]# bash he.sh
5050
5050
5050
[root@localhost ~]#
练习2:写一个脚本,给脚本传输一个值,计算从1到这个值的和
[root@localhost ~]# cat demo1.sh
#!/bin/bashecho -n "input start number:" $1
echo -n "input end number:" $2
let n=$2-$1+1
echo "count:"$(($n*($1+$2)/2))
[root@localhost ~]# bash demo1.sh 1 5
input start number: 1input end number: 5count:15
[root@localhost ~]#