目录
shell 的变量
系统变量
$HOME : 当前登录用户的 " 家目录 " 路径
$USER :当前用户名
$RANDOM 可以随机生成 0~32767 之间的整数数字
自定义变量
变量名 = 值;常量: readonly
xm=" 你好 "
echo " 姓名: $xm"
echo ' 姓名: $xm'
readonly p=3.14
n=`cat /etc/passwd | grep -c "root"`
echo $n
特殊变量
1. $n n 为 number , $0 代表该脚本名称, $1-$9 代表第一到第九个参数
2. $# 获取所有输入参数的个数,常用于循环;
3. $@ 代表命令行中所有的参数, $@ 会把每个参数区分对待;
4. $? 返回最后一次命令执行的状态,返回 0 代表正确执行,返回非 0 代表执行
不正确。
read 读取终端输入
-p :指定读取值时的提示符;
-t :指定读取值时等待的时间(秒)。
read -p " 请输入密码: " s
read -p " 请输入密码: " -t 10 mima
运算符
赋值运算符 =
算数运算符 + - * / %
比较运算符
字符串比较: == !=
数值比较: -eq 等于 -ne 不等于 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于
类型权限: -f 存在且是文件 -d 存在且是目录 -r 读 (read) -w 写 (write) -x 执行
(execute)
逻辑运算符 -a -o !
算数运算符
1. $(( 运算式 )) 或 $[ 运算式 ] 2. + , - , *, /, % 加,减,乘,除,取余
echo 3 + 4
n1=3
n2=4
echo $((($n1+$n2*3)/2%2))
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
let c=($a + $b)
echo $c
if 选择结构 ---then 独立一行
if [ 条件判断 ]
then
程序
elif [ 条件判断 ]
then
程序
else
程序
fi
case 语句 等值判断
case $ 变量名 in
"value 1" )
如果变量的值等于 value 1 ,则执行程序 1
;;
"value 2" )
如果变量的值等于 value 2 ,则执行程序 2
;;
… 省略其他分支 …
* )
如果变量的值都不是以上的值,则执行此处程序
;;
esac
# if 结构
sex=" 男 "
if [ $sex == " 男 " ]
then
echo " 去做饭 "
elif [ $sex == " 女 " ]
then echo " 去逛街 "
else
echo " 其他 "
fi
# case 结构
sex=" 男 "
case $sex in
" 男 ")
echo "1"
;;
" 女 ")
echo "2"
;;
*)
echo "3"
;;
esac
# 多条件应用
a=3
b=4
c="s"
if [ $a -lt $b -a $c == "s" ]
then
echo "true"
else
echo "false"
fi
# 判断文件是否存在
if [ -f /root/a.txt ]
then
echo " 是 "
cat /root/a.txt
else
echo " 不是 "
fi
上机练习 10
# 1. 编写脚本,将系统日志文件(/var/log/messages),拷贝到/root/文件夹中
# cp /var/log/messages /root/
# 2. 编写脚本,通过位置参数传入学生的姓名和班级,打印“我的名字叫 xx,我
的班级是
# xx 班”# sname="ShiHaiHong"
# class="60"
# echo "我的名字叫${sname},我的班级是${class}班"
# 3. 用 if,写一个 shell 脚本,运行时输入一个数字,如果是 666 则输出 evil,
如果是 777 则
# 输出 lucky, 如果是其他则输出 human。
# read -p "输入一个数字:" number
# if [ $number == 666 ]
# then
# echo "evil"
# elif [ $number -eq 777 ]
# then
# echo "lucky"
# else echo "human"
# fi
# 4. 用 case 方法改写上面的功能。
# read -p "输入一个数字:" number
# case $number in
# "666")
# echo "evil"
# ;;
# "777")
# echo "lucky"
# ;;
# *)
# echo "human"
# ;;
# esac
# 5. 判断/root/hosts 是否是存在并且是普通文件,如果不存在则新建一个,如果
已经存
# 在,则追加写入当前时间到此文件中
# if [ -f /root/hosts.txt ]
# then
# date>>/root/hosts.txt
# else
# touch /root/hosts.txt
# fi
# 6. 判断当前用户是否为 root,如果不是则打印非 root 账号,是的话就执行
ifconfig 查看
# 网卡信息($USER 获取当前用户)
# if [ $USER == "root" ]
# then
# ifconfig
# else# echo $USER
# fi
# 7. 编写脚本判断 mysql 是否正常启动(端口号 3306,查看端口 netstat -nltp,然
后 grep 过
# 滤返回行数,判断行数是否大于 0)
# if [ $(netstat -nltp | grep -c "3306") -gt 0 ]
# then
# echo "mysql 已正常启动"
# else
# echo "mysql 还未开启"
# fi
# 8. 位置参数传递一个绝对路径的文件,添加所有人可执行权限且提示添加执行
权限成
# 功,如果没有传递参数提示没有传递文件,如果传递的文件不存在则先创建再
赋权。
# read -p "填写一个文件" dir
# if [ $# -eq 0 ]
# then
#
echo "没有传递文件"
# fi
# if [ -f $dir ]
# then
#
echo "确实有这个文件,正在赋权"
#
chmod a+x $dir
# else
#
echo "文件不存在,自行创建"
#
touch $dir
#
chmod a+x $dir
# fi
# 9. 首先显示当天日期, 然后查找给定的用户是否在系统中工作(cat
/etc/passwd)。
# 如果在系统中,就输出一条欢迎语句(例如 hello,root!);如果不在系统中,
就
# 输出一条语句(waiting for root!)
# date
# read -p "用户名称:" suser
# if [ $(cat /etc/passwd | grep "$suser" | wc -l) -gt 0 ]
# then
# echo "hello,root!"
# else
# echo "waiting for root!"
# fi
# 10. 接受一个参数,若给定参数不是目录, 则给出提示信息;# 否则使用 ls -l 命令列出该目录下的内容,并输出有多少个子目录(d 开头),
多少
# 个普通文件(-开头)。显示示例如下:
# 目录的数量:16
# 文件的数量:25
# read -p "输入参数" dir
# if [ -d $dir ]
# then
# ls -l $dir
# echo "目录的数量:$(ls -l $dir|grep -c "^d")"
# echo "文件的数量:$(ls -l $dir|grep -c "^-")"
# else
# echo "这不是目录"
# fi
附加题
#制作一个猜拳游戏
# read -p "请出拳(石头,剪刀,布):" hand
# if [ $hand == "石头" -o $hand == "剪刀" -o $hand == "布" ]
# then
# echo "玩家:$hand"
# echo -n "电脑:"
#
if [ $RANDOM -ge 0 -a $RANDOM -le 11000 ]
#
then
#
computer="剪刀"
#
elif [ $RANDOM -ge 11001 -a $RANDOM -le 22000 ]
#
then
#
computer="石头"
#
elif [ $RANDOM -ge 22001 -a $RANDOM -le 32767 ]
#
then
#
computer="布"
#
fi
#
echo $computer
#
if [ $computer == $hand ]
#
then
#
echo "平局"
#
elif [ $computer == "剪刀" -a $hand == "布" -o $computer == "石头" -a $hand
== "剪刀" -o $computer == "布" -a $hand == "石头" ]
#
then
#
echo "电脑赢"
#
elif [ $computer == "布" -a $hand == "剪刀" -o $computer == "剪刀" -a $hand
== "石头" -o $computer == "石头" -a $hand == "布" ]
#
then
#
echo "玩家赢"#
fi
# else
#
echo "不要作弊"
# fi
for 循环
for i in 集合
# 序列
for i in `seq 1 5`
do
echo $i
done
# 位置参数
for i in $@
do
echo $i
done
# 字符串
s="a b c dd e"
for i in $s
do
echo $i
done
# 命令结果
s=`ls /root` echo $s
echo $s
for i in $s
do
echo $i
done
while 循环
while [ 条件判断 ]
i=1
while [ $i -le 10 ]
do
echo $i
i=$(($i+1))
done
# 不确定循环次数
read -p " 及格了吗?( y/n ): " answer
while [ $answer == "n" ]
do echo " 学习做作业考试 "
read -p " 及格了吗?( y/n ): " answer
done
echo " 终于及格了 "
乘法表(双层嵌套)
for i in `seq 1 9`
do
for j in `seq 1 $i`
do
echo -n " $j * $i = $(($i * $j)) "
done
echo ""
done
循环控制
break 等同 plsql 的 exit
continue
上机练习 11
# 1.鸡兔同笼(同前面 PLSQL 的题目,DAY13)
# for chicken in `seq 0 35`
# do
#
rabbit=$((35 - $chicken))
#
if [ $(($rabbit*4 + $chicken*2)) -eq 94 ]
#
then
#
echo "共有${chicken}只鸡,${rabbit}只兔"
#
fi
# done
# 2.猴子吃桃(同前面 PLSQL 的题目,DAY13)
# pea=1
# for day in `seq 1 10`
# do
#
pea=$((2 * ($pea+1)))
# done
# echo "有${pea}个桃子"
# 3.创建用户组 wanmei,批量建立用户 wm1 到 wm9,用户属于 wanmei 组,创建完
成查
# 看/etc/group 和 /etc/passwd 文件
##groupadd wanmei
# for i in `seq 1 9`
# do
#
useradd -g wanmei "wm$i"
# done#终端查看
#cat /etc/group
#cat /etc/passwd
# 4.删除上面的用户和用户组
# for i in `seq 1 9`
# do
#
userdel "wm$i"
# done
# groupdel wanmei
# 5.实现传入一个目录作为参数,如果传入的不是目录则提示不是目录,如果是
目录则将
# 该目录下所有的普通文件的文件名都罗列出来
# if [ -d $1 ]
# then
# ls -l $1 | grep "^-"
# else
# echo "不是目录"
# fi
# 方法二
# if [ -d $1 ]
# then
#
for i in `ls $1`
#
do
#
if [ -f "$1/$i" ]
#
then
#
echo $i
#
fi
#
done
# else
# echo "不是目录"
# fi
# 6.猜数字游戏:电脑随机产生一个 100 以内的数字(1-99),通过每次键盘输
入来猜数
# 字,输入的小了就提示往大猜,输入大了就提示往小里猜, 直到输入正确数
字(通过
# $RANDOM 获取随机数)
# ComputerNumber=$(($RANDOM % 99 + 1))
# read -p "猜猜看呐" no
# if [ $no -ge 1 -a $no -le 99 ]
# then
#
while [ $no != $ComputerNumber ]
#
do
#
if [ $no -lt $ComputerNumber ]#
then
#
read -p "猜小了,再试一遍吧" no
#
elif [ $no -gt $ComputerNumber ]
#
then
#
read -p "猜大了,再试一遍吧" no
#
elif [ $no -gt 99 -o $no -lt 1 ]
#
then
#
read -p "数字不在范围内啊!" no
#
fi
#
done
#
echo "你终于答对了,恭喜!"
# else
#
echo "不是数字或数字过大!"
# fi
# 7.查看 100 到 200 以内素数并统计素数的个数
# count=0
# for i in `seq 100 200`
# do
#
flag=true
#
for j in `seq 2 $(($i-1))`
#
do
#
if [ $(($i%$j)) -eq 0 ]
#
then
#
flag=false
#
break
#
fi
#
done
#
if [ $flag == true ]
#
then
#
echo $i
#
count=$(($count+1))
#
fi
# done
# echo "有${count}个素数"
把附加题代码修改为循环形式
# read -p "来玩猜拳吗?(y/n)" wan
# while [ $wan == 'y' ]
# do
# read -p "请出拳(石头,剪刀,布,我不玩了):" hand
# if [ $hand == "我不玩了" ]
# then
#
break
# elif [ $hand == "石头" -o $hand == "剪刀" -o $hand == "布" ]# then
# echo "玩家:$hand"
# echo -n "电脑:"
#
if [ $RANDOM -ge 0 -a $RANDOM -le 11000 ]
#
then
#
computer="剪刀"
#
elif [ $RANDOM -ge 11001 -a $RANDOM -le 22000 ]
#
then
#
computer="石头"
#
elif [ $RANDOM -ge 22001 -a $RANDOM -le 32767 ]
#
then
#
computer="布"
#
fi
#
echo $computer
#
if [ $computer == $hand ]
#
then
#
echo "平局"
#
elif [ $computer == "剪刀" -a $hand == "布" -o $computer == "石头" -a $hand
== "剪刀" -o $computer == "布" -a $hand == "石头" ]
#
then
#
echo "电脑赢"
#
elif [ $computer == "布" -a $hand == "剪刀" -o $computer == "剪刀" -a $hand
== "石头" -o $computer == "石头" -a $hand == "布" ]
#
then
#
echo "玩家赢"
#
fi
# else
#
echo "不要作弊"
# fi
# done
# echo "下次再会~"
需要使用代码请自行消去注释。(ctrl+/)
吐槽一下,这个 shell 脚本语法规则真的古怪,琢磨死人了!!!