shell脚本基础
shell:语言
脚本:可以运行,一个文件,可以实现某种功能(命令的堆积)
解释型程序
顺序,批量执行
[root@server0 ~]# vim /opt/test.sh
echo hello world
[root@server0 ~]# chmod +x /opt/test.sh
[root@server0 ~]# /opt/test.sh
shell脚本的一般组成
#!环境声明(Sha-Bang)
#注释文本
可执行代码
shell脚本使用技巧
管道功能
重定向输出
>:只收集前面命令的正确输出
2>:只收集前面命令的错误输出
&>:收集前面命令的所有输出
黑洞设备:/dev/null
使用变量
变量:容器 以不变名称,存放可能变化的值
作用:让脚本适用多变的环境
为变量赋值:
变量名=变量值
read 为变量赋值,读取用户在键盘上的输入,将用户输入的内容赋值给变量
#! /bin/bash #环境声明
read -p '请输入用户名:' user
read -p '请输入密码:' passwd
useradd $user &> /dev/null
echo 用户$user创建成功
echo $passwd | passwd --stdin $user &> /dev/null
echo 用户$user密码设置成功
注:等号两边不要有空格
只能由字母/数字/下划线组成,区分大小写
变量不能以数字开头,不要使用关键字和特殊字符
查看/引用变量
基本格式
引用变量值:$变量名
查看变量值:echo $变量值、echo ${变量值}
$[ ]:代表运算
$( )和``:将命令输出结果作为参数 [root@server0 opt]# mkdir mariadb-`date +%F`
单引号' ':取消特殊字符的意义 [root@server0 opt]# echo '? * [] {}'
举例:生成随机数 $RANDOM
范围为 0~99 之间的随机数(求余运算)[root@server0 opt]# echo $[$RANDOM%100]
变量的种类
环境变量:
PWD、PATH、USER(当前用户名)、LOGNAME
SHELL、HOME
USER:存放登陆的用户身份
PATH:存储命令的搜寻路径
执行命令时,都会去PATH变量值中去寻找该命令的执行程序
如果找到就执行,不能则报告命令找不到
[root@server0 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server0 ~]# cp /PATH/TO/SOMEWHERE /usr/bin #将自己的可执行程序添加到搜索路径
位置变量(执行脚本时提供命令行参数):
表示为$n,n为序号
$1、$2、...${10}、${11}、...
[root@server0 opt]# vim /root/test.sh
#! /bin/bash #环境声明
cat -n $1 | head -$2
[root@server0 opt]# chmod +x /root/test.sh
[root@server0 opt]# /root/test.sh /etc/passwd 5
预定义变量(用来保存脚本的执行信息):
$# 已加载的位置变量的个数(计算使用位置变量的总数)
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
条件测试及选择
检查文件状态:
-e:存在为真
-d:存在且为目录为真
-f:存在且为文件为真
-r:存在且对对象有读权限为真
-w:存在且对对象有写权限为真
-x:存在且对对象有执行权限为真
比较整数大小(带g的都有大于,带e的都有等于,带l的都有小于)
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
字符串比对
==:字符串一致为真
!=:字符串不一致为真
if选择结构
if双分支处理:
if[条件测试];then
命令序列01
else
命名序列02
fi
举例:
#! /bin/bash
num1=$[$RANDOM%10]
read -p '请您输入0~9之间的数:' num2
if [ $num1 -eq $num2 ];then
echo 恭喜您猜对了
else
echo 再见
fi
if多分支处理:
if[条件判断1];then
命令序列01
elif[条件判断1];then
命名序列02
elif[条件判断1];then
命名序列03
else
命令序列04
fi
举例:判断用户输入的成绩
如果 成绩大于等于90 则输出优秀
如果 成绩大于等于80 则输出良好
如果 成绩大于等于70 则输出及格
如果 成绩大于等于60 则输出仍需努力
以上条件均不满足 则输出再牛的肖邦,也弹不出哥的悲伤
#! /bin/bash
read -p '请输入您的成绩:' nsd
if [ $nsd -ge 90 ];then
echo 优秀
elif [ $nsd -ge 80 ];then
echo 良好
elif [ $nsd -ge 70 ];then
echo 及格
elif [ $nsd -ge 60 ] ;then
echo 仍需努力
else
echo 再牛的肖邦,也弹不出哥的悲伤
fi
列表式循环
for循环结构:
for 变量名 in 值列表
do
命令序列
done
#! /bin/bash
for a in nsd11 nsd12 nsd13 nsd14 nsd15
do
useradd $a
echo 用户$a创建成功
done
参考案例1:
[root@server0 ~]# vim /root/foo.sh
#! /bin/bash
if [ $# -eq 0 ];then #判断位置变量的个数是否为0个
echo '/root/foo.sh redhat|fedora' >&2 #将正确的输出结果变成错误的输出
exit 1 #脚本退出返回值
elif [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo '/root/foo.sh redhat|fedora' >&2
exit 1
fi
[root@server0 ~]# chmod +x /root/foo.sh
参考案例2:
#!/bin/bash
if [ $# -eq 0 ];then
echo 'Usage:/root/batchusers' >&2
exit 1
elif [ -f $1 ];then
for i in `cat $1`
do
useradd -s /bin/false $i
echo $i成功创建
done
else
echo 'Input file not found' >&2
exit 2
fi