变量--值
变量的赋值
直接赋值,简单粗暴,例: name=zls
间接赋值,我们将一个命令执行的结果赋值给一个变量,例:IP= ifconfig eth0|awk 'NR==2{print $2}'
交互赋值,我们需要跟脚本进行交互,例:read
传参赋值,执行脚本的时候,将需要传递的变量值,写在脚本的后面 $1 $2 $3
###### 例子 ######
# 直接赋值
name=xxx
dir=/root
# 间接赋值
ip=`ifconfig eth0 | awk 'NR==2{print $2}'`
# 交互赋值 name的变量值取决于你屏幕的输入
#!/bin/bash
read -p "please input your password" name
echo $name
# 传参赋值
$1 $2 $3
#!/bin/bash
echo $1 $2 $3
[root@m01 scripts]# sh 2.sh a z l
a z l
read
选项 |
作用 |
-p |
打印一段字符 |
-s |
静默输入 |
-t |
超时时间 |
-a |
将后面的结果放入数组 |
# -p
# 例子
cat 2.sh
#!/bin/bash
read -p "请输入你的账号:" user
read -p "请输入你的密码:" pass
echo $user
echo $pass
# 例子的执行结果
sh 2.sh
请输入你的账号:root
请输入你的密码:123
root
123
# -s 静默输出/不显示输入的内容
#!/bin/bash
read -p "请输入你的账号:" user
read -s -p "请输入你的密码:" pass
echo $user
echo $pass
# -t 超时时间
#!/bin/bash
read -p "请输入你的账号:" user
read -s -t5 -p "请输入你的密码:" pass
echo $user
echo $pass
# -a 将后面的结果放到数组
read -p "m01 login:" -a user
read -s -p "Password:" pass
echo ${user[0]}
echo ${user[1]}
echo ${user[2]}
if [ $pass == $password ];then
echo "成功登录"
else
echo "登录失败"
fi
shell的数据类型
字符型
整形
数组
shell数据类型--字符串
[root@m01 scripts]# name=hahaha
[root@m01 scripts]# echo $name
[root@m01 scripts]# hahaha
[root@m01 scripts]# name="闪电五连鞭"
[root@m01 scripts]# echo $name
闪电五连鞭
shell数据类型--整形
[root@m01 scripts]# cat 2.sh
#!/bin/bash
age=18
if [ $age -lt 20 ];then
echo lt 20
else
echo gt 20
fi
[root@m01 scripts]# sh 2.sh
lt 20
[root@m01 scripts]# cat 2.sh
#!/bin/bash
age=balabala
if [ $age -lt 20 ];then
echo lt 20
else
echo gt 20
fi
[root@m01 scripts]# sh 2.sh
2.sh: line 4: [: balabala: integer expression expected ##### 不能跨数据类型比较
gt 20
shell数据类型--数组
# 数组赋值
[root@m01 scripts]# list=(python java golong shell c)
# 调用数组
[root@m01 scripts]# echo $list
python
[root@m01 scripts]# echo ${list[0]}
python
[root@m01 scripts]# echo ${list[1]}
java
[root@m01 scripts]# echo ${list[2]}
golong
[root@m01 scripts]# echo ${list[3]}
shell
[root@m01 scripts]# echo ${list[4]}
c
[root@m01 scripts]# echo ${list[5]}
[root@m01 scripts]# echo ${list[*]}
python java golong shell c
[root@m01 scripts]# echo ${list[@]}
python java golong shell c
# 第二种赋值
[root@m01 scripts]# list[0]='a'
[root@m01 scripts]# list[1]='b'
[root@m01 scripts]# list[2]='c'
# 调用
[root@m01 scripts]# echo ${list[0]}
a
[root@m01 scripts]# echo ${list[1]}
b
[root@m01 scripts]# echo ${list[2]}
c
shell的运算符号
运算方法--(()) 不支持非整型
## 1.常规运算
[root@zabbix01 script]# echo $((1+1))
2
[root@zabbix01 script]# echo $((2**10))
1024
## 2.变量运算
[root@zabbix01 script]# n1=111
[root@zabbix01 script]# n2=222
[root@zabbix01 script]# echo $((n1+n2))
333
## 3.运算赋值
# 方法一
[root@zabbix01 script]# n3=`echo $((n1*n2))`
[root@zabbix01 script]# echo $n3
24642
# 方法二
[root@zabbix01 script]# ((n4=n1*n2))
[root@zabbix01 script]# echo $n4
24642
运算方法--let 不支持非整形
[root@m01 scripts]# let a=1+1
[root@m01 scripts]# echo $a
2
# 不支持浮点型
[root@m01 scripts]# let a=1+1.5
-bash: let: a=1+1.5: syntax error: invalid arithmetic operator (error token is".5")
运算方法--expr 不支持非整形
[root@m01 scripts]# expr 1 + 1
2
[root@m01 scripts]# expr 3 + 1
4
[root@m01 scripts]# expr 2 * 2.5
expr: syntax error
[root@m01 scripts]# expr 26 / 5
5
## 错误写法,因为*在bash里是通配符,所以echo一下就知道
[root@m01 scripts]# expr 2 * 3
expr: syntax error
[root@m01 scripts]# expr 2 \* 3
6
运算方法--bc 支持非整形
[root@m01 scripts]# echo 1+2 | bc
3
[root@m01 scripts]# echo 1*2 | bc
2
[root@m01 scripts]# echo 2*6 | bc
12
[root@m01 scripts]# echo 25/5 | bc
5
[root@m01 scripts]# echo 26%5 | bc
1
[root@m01 scripts]# echo 2.5+2.6 | bc
5.1
[root@m01 scripts]# echo 26/5 | bc
5
[root@m01 scripts]# echo 26/5 | bc -l
5.20000000000000000000
echo 'scale=100;a(1)*4' | bc -l
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676
运算方法awk
[root@m01 scripts]# awk 'BEGIN{print 1+2,2**10}'
3 1024
[root@m01 scripts]# awk '{print 1+2,2**10}'
1+2
3 1024
^C
[root@m01 scripts]# awk 'BEGIN{print 1+2,2**10}'
3 1024
[root@m01 scripts]# awk 'BEGIN{print 1+2}'
3
[root@m01 scripts]# awk 'BEGIN{print 1.6+1.5}'
3.1
[root@m01 scripts]# awk 'BEGIN{print 26/5}'
5.2
余数的使用
###### 随机点名脚本 #####
read -p "请输入滚动此处:" count ##
clear ## 清楚屏幕
for ((i=1;i<=$count;i++)) ## i做一个自增的计算
do
line=$(cat /root/stu.txt|wc -l) ##读取共多少stu.txt一共有多少行 (人数)
num=$(($RANDOM%$line+1)) ##随机取人数中的其中之一
stu=`sed -n "${num}p" /root/stu.txt` ## 随机取出的那一行赋值给stu
sleep 0.1 ## 等待0.1秒
printf "$stu \r" ## 打印stu 换行符号
done
username=$(sed -n "${num}p" /root/stu.txt) ## 赋值给username
echo -e 这次回答的是:$username ## 输出最后一个取到的数字
shell的自增
#!/bin/bash
for ((i=1;i<=10;i++));do
echo $i
done
# 上面的方式一般开发写的多一点
# 运维一般下面的方式去做自增
for n in `seq 10`;do
echo $n
done
# 计算会消耗相关的资源
# 会消耗cpu资源
# 机器的效率会降低