变量
创建变量赋值
[root@moyue01 data]# name=zhang
[root@moyue01 data]# echo $name
zhang
#name为一个普通变量
#---------------------------------------------------------------
[root@moyue01 data]# set
#查看变量
colors=/root/.dircolors
name=zhang
varable=
#---------------------------------------------------------------
[root@moyue01 data]# unset name
#删除变量
[root@moyue01 data]# set
colors=/root/.dircolors
varable=
#---------------------------------------------------------------
只读变量
[root@moyue01 data]# readonly name
[root@moyue01 data]# name=li
-bash: name: 只读变量
只读变量不能更改只能查看
[root@moyue01 data]# echo name
name
只读变量不能删除下次开机时消失
[root@moyue01 data]# unset name
bash: unset: name: 无法反设定: 只读 variable
#---------------------------------------------------------------
环境变量
[root@moyue01 data]# bash
进入子程序
[root@moyue01 data]# echo $name
找不到变量
[root@moyue01 data]# exit
exit
退出子程序
[root@moyue01 data]# export name
#转成环境变量
[root@moyue01 data]# export
declare -x ZOOKEEPER_HOME="/usr/local/zookeeper"
declare -rx name
declare -rx varable=""
可以查看有哪些环境变量
[root@moyue01 data]# bash
[root@moyue01 data]# echo $name
name
#---------------------------------------------------------------
位置变量
[root@moyue01 data]# vim demo.sh
#!/bin/bash
echo $0
echo $1
echo ${10}
#注意!!!大于等于10需要用{}否则会当成$1和0进行拼接
[root@moyue01 data]# chmod 700 demo.sh
更改权限
[root@moyue01 data]# ./demo.sh 1 2 3 4 5 6 7 8 9 10 11
./demo.sh #对应$0
1 #对应$1
10 #对应${10}
#---------------------------------------------------------------
特殊变量
[root@moyue01 data]# vim demo.sh
#!/bin/bash
echo $#
echo $*
echo $@
echo $$
echo $?
echo $!
[root@moyue01 data]# ./demo.sh 1 2 3 4 5 6
6 #对应$#显示参数个数
1 2 3 4 5 6 #对应$*显示所有参数(每个参数相互独立)
1 2 3 4 5 6 #对应$@显示所有参数(所有参数当成一个字符串)
49786 #对应$$显示当前进程的进程pid
0 #对应$?显示上一次命令是否执行成功
#对应$!显示最后一次进程的pid
三大常用指令
- read
-p #指定提示信息
[root@moyue01 data]# vim demo.sh
#!/bin/bash
read -p "输入账号:" user
read -p "输入密码:" passwd
echo "欢迎用户${user}登陆"
[root@moyue01 data]# ./demo.sh
输入账号:zhang
输入密码:123
欢迎用户zhang登陆
#----------------------------------------------------------------
-n 限定字符长度
[root@moyue01 data]# vim demo.sh
#!/bin/bash
read -p "输入账号:" -n 2 user
read -p "输入密码:" passwd
echo "欢迎用户${user}登陆"
[root@moyue01 data]# ./demo.sh
输入账号:zh输入密码:123
欢迎用户zh登陆
#达到两个字符后会自动回车
#----------------------------------------------------------------
-t 限定时间
[root@moyue01 data]# vim demo.sh
#!/bin/bash
read -p "输入账号:" -t 3 user
read -p "输入密码:" -t 3 passwd
echo "欢迎用户${user}登陆"s
[root@moyue01 data]# vim demo.sh
[root@moyue01 data]# ./demo.sh
输入账号az输入密码123欢迎用户登陆
#时间到了没用回车就没用赋值
-t 限定时间
#----------------------------------------------------------------
[root@moyue01 data]# vim demo.sh
#!/bin/bash
read -p "输入账号:" -s user
read -p "输入密码:" -s passwd
echo "欢迎用户${user}登陆"s
[root@moyue01 data]# vim demo.sh
[root@moyue01 data]# ./demo.sh
输入账号:
输入密码:
欢迎用户zhang登陆
#隐藏账号密码
- expr
用于计算
[root@moyue01 data]# int1=1
[root@moyue01 data]# int2=2
[root@moyue01 data]# echo ` expr $int1 + $int2 `
3
[root@moyue01 data]# echo $(expr $int1 + $int2)
3
[root@moyue01 data]# echo $(expr $int1 - $int2)
-1
[root@moyue01 data]# echo $(expr $int1 \* $int2)
2
[root@moyue01 data]# echo $(expr $int1 \/ $int2)
0
[root@moyue01 data]# echo $(expr $int1 \% $int2)
1
- test
一般不使用
(())更为简单
-a等价于&&
-o等价于||
i等价于!
整数
[ $a -eq $b ]判断是否相等
[ $a -ne $b ]判断是否不相等
[ $a -gt $b ]判断$a是否大于$b
[ $a -it $b ]判断$a是否小于$b
[ $a -ge $b ]判断$a是否大于等于$b
[ $a -le $b ]判断$a是否小于等于$b
字符串
-z检测是否为空
-n检验是否不为空
string1 == string2 检验string1是否等于string2
string1 != string2 建议string1是否不等于string2
字符串
单引号
单引号内所有的字符都没有意义
双引号
双引号可以配合变量使用
字符长度
#
[root@moyue01 data]# echo $name #这里没用变量name长度为0
[root@moyue01 data]# echo ${#name}
0
[root@moyue01 data]# age=19
[root@moyue01 data]# echo ${#age}
2
length
[root@moyue01 data]# age=19
[root@moyue01 data]# echo length ${age}
2
#-----------------------------------------------------------------------
截取
[root@moyue01 data]# age=19
[root@moyue01 data]# echo ${age:1}
9
从下标1开始截取
[root@moyue01 data]# name=zhangsan
[root@moyue01 data]# name=zhangsan
[root@moyue01 data]# echo ${name:2:2}
an
从下标2开始截取2个
[root@moyue01 data]# echo ${name:0-3:2}
sa
从倒数第三个开始截取2个
数组
只有一维数组且没用长度限制
varable=(value1 value2 value3 ~)
[root@moyue01 data]# vim demo.sh
#!/bin/bash
varable=(1 2 3)
echo ${varable[0]}
echo ${varable[1]}
echo ${varable[2]}
echo ${varable[*]}
echo ${varable[@]}
echo ${varable[-1]}
[root@moyue01 data]# ./demo.sh
1
2
3
1 2 3 #多个字符
1 2 3 #当成一个字符串
3 #倒数第一个元素
分支循环
- if分支
if [ 条件 ] ; then
逻辑体
fi
[root@moyue01 data]# vim stu.sh
#!/bin/bash
if [ $1 == 2 ] ;then
echo "$1"
fi
[root@moyue01 data]# ./stu.sh 2
2
#---------------------------------------------------------------------------
else写法
if [ 条件 ] ; then
逻辑体
else
逻辑体
fi
[root@moyue01 data]# vim stu.sh
#!/bin/bash
if [ $1 == 2 ] ;then
echo "$1"
else
echo "参数错误"
fi
[root@moyue01 data]# ./stu.sh 1
参数错误
#---------------------------------------------------------------------------
elif写法
if [ 条件 ] ; then
逻辑体
elif [ 条件 ] ; then
逻辑体
else
逻辑体
fi
[root@moyue01 data]# vim stu.sh
#!/bin/bash
if [ $1 == 2 ] ; then
echo "$1"
elif [ $1 == 3 ] ; then
echo "$1"
else
echo "参数错误"
fi
[root@moyue01 data]# ./stu.sh 3
3
- case分支
case ... in
value1)
逻辑体
;;
value2)
逻辑体
;;
*)
逻辑体
;;
esac
#!/bin/bash
case $1 in
1|2|3|4|5)
echo "${1}在[1,5]内"
;;
6|7|8|9|10)
echo "${1}在[6,10]内"
;;
*)
echo "不在范围"
esac
[root@moyue01 data]# ./stu.sh 6
6在[6,10]内
- while
while [ 条件 ]
do
逻辑体
done
#-----------------------------------------------------------------------------
#!/bin/bash
read -p "输入次数" i
while (( $i > 0 ))
do
echo "$i"
let i--
done
[root@moyue01 data]# ./stu.sh
输入次数3
3
2
1
- until
until [ 条件 ]
do
逻辑体
done
[root@moyue01 data]# vim stu.sh
#!/bin/bash
read -p "输入密码" passwd
sum=1
until [ $passwd == "123456" ]
do
read -p "请从新输入:" passwd
if [ $sum == 2 ];then
break
fi
let sum++
done
[root@moyue01 data]# ./stu.sh
输入密码123
请从新输入:123
请从新输入:123
- for
for循环
for 变量 in 列表
do
执行逻辑
done
[root@moyue01 data]# vim stu.sh
#!/bin/bash
sum=0
echo "素数:1"
echo "素数:2"
for (( x = 2 ; x <= 1000 ; x++ ))
do
for ((y = 2 ; y < x ; y++))
do
if ((x % y == 0));then
sum=0
break
else
sum=1
fi
done
if ((sum==1));then
echo "素数:"$x
fi
done
[root@moyue01 data]# ./stu.sh
素数:1
素数:2
素数:3
素数:5
素数:7
- select
列表的选择
select varable in 列表
do
done
[root@moyue01 data]# vim stu.sh
#!/bin/bash
select var in monday tuesday wenseday
do
echo "your option is"$var
if [ $var == "tuesday" ];then
break
fi
done
[root@moyue01 data]# ./stu.sh
1) monday
2) tuesday
3) wenseday
#? 1
your option ismonday
- shift
shift一次数据向前移
until [条件]
do
逻辑体
done
[root@moyue01 data]# vim stu.sh
#!/bin/bash
sum=0
until [ "$1" == "" ]
do
sum=`expr $sum + $1 `
shift
done
echo "sum:${sum}"
[root@moyue01 data]# ./stu.sh 1 2 3 4 5 6 7 8 9
sum:45
- 函数
定义函数
[function] funcname (){
函数体
}
funcname可以调用
[root@moyue01 data]# vim stu.sh
#!/bin/bash
function funcname(){
echo "张三"
}
funcname
[root@moyue01 data]# . stu.sh
张三
脚本引入
. 文件名|source 文件名
[root@moyue01 data]# vim stu.sh
#!/bin/bash
function funcname(){
echo "张三"
}
funcname
[root@moyue01 data]# . stu.sh
[root@moyue01 data]# funcname
张三