目录
一、变量
一、位置变量
位置变量:用于处理命令行传递给shell脚本的参数(0-9)
[root@localhost ~]# vim wzbl.sh
[root@localhost ~]# chmod +x wzbl.sh#赋予脚本可执行权限
[root@localhost ~]# ./wzbl.sh yes no
./wzbl.sh
yes
no
$0:表示当前执行的脚本
$1:第一个参数
$2:第二个参数
[root@localhost ~]# vim pass.sh
[root@localhost ~]# chmod +x pass.sh
[root@localhost ~]# ./pass.sh zhangsan 123
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
二、预定义变量
预定义变量是由bash程序预先定义好的一类特殊变量,用户只能使用,不能创建新的预定义变量。
$?:表示前一条命令执行后的返回状态,执行成功返回值为0,执行不成功返回值为非0值
[root@localhost ~]# cd opt
-bash: cd: opt: 没有那个文件或目录
[root@localhost ~]# echo $?
1
[root@localhost ~]# cd /opt
[root@localhost opt]# echo $?
0
$#:表示命令行中位置参数个数
[root@localhost ~]# wzbl.sh yes no
[root@localhost ~]# ./wzbl.sh yes no
2
$*:表示所有位置参数的内容为一个整体
[root@localhost ~]# ./wzbl.sh 1 2 3
[root@localhost ~]# ll
$@:表示列出所有位置参数内容
[root@localhost ~]# ./wzbl.sh 1 2 3
[root@localhost ~]# ll
$$:当前进程的进程号
[root@localhost ~]# echo $$
9212
[root@localhost ~]# ps aux | grep 9212
root 9212 0.0 0.0 118940 3412 pts/0 Ss 10:01 0:00 -bash
root 21821 0.0 0.0 112728 988 pts/0 S+ 15:09 0:00 grep --color=auto 9212
$!:上一个后台进程的进程号,没有后台进程为空
[root@localhost ~]# sleep 1000 &
[1] 21845
[root@localhost ~]# echo $!
21845
二、重定向
一、交互式硬件设备
1、标准输入:从该设备接收用户输入的数据
2、标准输出:通过该设备向用户输出数据
3、标准错误:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
二、重定向操作
重定向输入
< 将后面的文件
[root@localhost ~]# vim pass.txt
[root@localhost ~]# passwd wangwu < pass.txt
更改用户 wangwu 的密码 。
新的 密码:无效的密码: 密码少于 8 个字符
重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
重定向输出
> :将正确的输出结果保存到指定的文件(覆盖原有内容)(或1>)
> > :将正确的输出结果追加到指定的文件尾部(或1>>)
[root@localhost ~]# ls xxx > uu.txt
ls: 无法访问xxx: 没有那个文件或目录
[root@localhost ~]# ls > uu.txt
[root@localhost ~]# vim uu.txt
标准错误输出
2> :将错误信息保存到指定文件(覆盖原有文件内容)
2>> :将错误信息追加到指定文件中
[root@localhost ~]# ls xxx 2> uu.txt
[root@localhost ~]# vim uu.txt
混合输出
&> :将正确输出和错误输出保存到同一个文件中
[root@localhost ~]# ls xxx pass.txt &> uu.txt
[root@localhost ~]# vim uu.txt
三、自定义变量的运算
整数变量的运算
常用运算符
加法运算: +
减法运算: -
乘法运算: *
除法运算: /
求模(取余)运算: %
expr
[root@localhost ~]# expr 1 + 1 #加法
2
[root@localhost ~]# expr 3 - 2 #减法
1
[root@localhost ~]# expr 2 \* 3 #乘法
6
[root@localhost ~]# expr 6 / 2 #除法
3
[root@localhost ~]# expr 10 % 3 #取余
1
[root@localhost ~]# a=10
[root@localhost ~]# b=2
[root@localhost ~]# expr $a + $b
12
echo
[root@localhost ~]# echo $[4*2]
8
[root@localhost ~]# a=10
[root@localhost ~]# b=2
[root@localhost ~]# echo $[$a*$b]
20
[root@localhost ~]# echo $[a*b]
20
[root@localhost ~]# echo $((2*4))
8
[root@localhost ~]# echo $((a*b))
20
let
[root@localhost ~]# a=10
[root@localhost ~]# let a++
[root@localhost ~]# echo $a
11
[root@localhost ~]# let a--
[root@localhost ~]# echo $a
10
[root@localhost ~]# echo $[a++] #先执行再加1
10
[root@localhost ~]# echo $a
11
[root@localhost ~]# echo $[++a] #先加1再执行
12
[root@localhost ~]# echo $a
12
bc(可以处理小数)
[root@localhost ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1*2
2
2^3
8
[root@localhost ~]# echo $[3**2]
9
[root@localhost ~]# let a=2**8
[root@localhost ~]# echo $a
256
[root@localhost ~]# echo "2^8" | bc
256
四、实验
第一题:
#!/bin/bash
#剪刀石头布人机对战
read -p "请出拳(石头、剪刀、布):" ask
ksa=$[RANDOM%3]
if [ $ksa -eq 0 ];then
if [ $ask == 拳头 ];then
echo "赢"
elif [ $ask == 布 ];then
echo "输"
else
echo "平"
fi
elif [ $ksa -eq 1 ];then
if [ $ask == 拳头 ];then
echo "平"
elif [ $ask == 布 ];then
echo "赢"
else
echo "输"
fi
else
if [ $ask == 拳头 ];then
echo "输"
elif [ $ask == 布 ];then
echo "平"
else
echo "赢"
fi
第二题:
#!/bin/bash
#输入一个月份,判断在一年那个季度
read -p "请输入月份:" yue
case $yue in
[1-3])
echo "第一季度";;
[4-6])
echo "第二季度";;
[7-9])
echo "第三季度";;
1[0-2])
echo "第四季度";;
*)
echo "输入错误"
esac
第三题:
#!/bin/bash
#写一个系统服务的控制脚本,控制服务的启动、重启、停止
read -p "请输入服务名:" name
read -p "请选择操作(start/restart/stop):" do
case $do in
start)
systemctl start $name
echo "开启成功"
;;
restart)
systemctl restart $name
echo "重启成功"
;;
stop)
systemctl stop $name
echo "停止成功"
;;
esac