linux学习笔记--工程师技术:shell脚本基础
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习笔记--工程师技术:shell脚本基础相关的知识,希望对你有一定的参考价值。
Shell脚本
脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)
规范Shell脚本的一般组成
#! 环境声明(Sha-Bang)
# 注释文本
可执行代码
#!/bin/bash #环境声明,声明写的脚本是bash这个程序翻译的
一、书写第一脚本程序
[[email protected] ~]# vim /root/1.sh
#!/bin/bash
echo hello world
hostname
cat /etc/redhat-release
ifconfig | head -2 | tail -1
[[email protected] ~]# /root/1.sh
二、书写为Server0自动搭建Yum的脚本
[[email protected] ~]# vim /root/yum.sh #要注意排版,echo里的内容要顶行写,echo 后的‘要在同一行
#!/bin/bash
rm -rf /etc/yum.repos.d/*
echo ‘[dvd]
name=dvd
baseurl=http://172.25.254.254/content/rhel7.0/x86_64/dvd/
enabled=1
gpgcheck=0‘ > /etc/yum.repos.d/haha.repo
yum clean all
yum repolist
[[email protected] ~]# /root/1.sh #显示权限不够,因为vim下写的都是普通的文本,需要赋予x执行权限
-bash: /root/1.sh: 权限不够
[[email protected] ~]# chmod +x /root/yum.sh
[[email protected] ~]# /root/yum.sh
管道传递
使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理
三、重定向输出
>:只收集前面命令的正确输出,错误的显示在命令行
2>:只收集前面命令的错误输出,正确的显示在命令行
&>:收集前面命令的错误与正确输出,不显示在命令行
[[email protected] ~]# echo 123 > /opt/1.txt
[[email protected] ~]# cat /opt/1.txt
[[email protected] ~]# cat /opt/1.txt /etc/
[[email protected] ~]# cat /opt/1.txt /etc/ > /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
[[email protected] ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
[[email protected] ~]# cat /opt/1.txt /etc/ &> /opt/a.txt
[[email protected] ~]# cat /opt/a.txt
-------------------------------------------------------------------------------------------
三、书写创建用户并设置密码的脚本
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
useradd test06
echo 123 | passwd --stdin test06
[[email protected] ~]# chmod +x /root/user.sh
[[email protected] ~]# /root/user.sh
更改用户 test06 的密码 。
passwd:所有的身份验证令牌已经成功更新。
要使其不显示信息
/dev/null #Linux黑洞设备,专用于收集不要的输出结果
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
useradd test06 &> /dev/null
echo test06创建成功
echo 123 | passwd --stdin test06 &> /dev/null
echo test06密码设置成功
[[email protected] ~]# chmod +x /root/user.sh
[[email protected] ~]# /root/user.sh
test06创建成功
test06密码设置成功
变量:为了增加脚本的适用环境的能力,增加脚本的灵活度,方便。
变量: 容器,以不变的名称,储存变化的值
变量名=变化的值
使用变量: $变量名
为了降低脚本使用难度,可以产生交互
read :可以产生交互,将键盘输入的内容赋值给变量
[[email protected] ~]# vim /root/user.sh
#!/bin/bash
read -p ‘请输入您要建立的用户:‘ user
read -p ‘请输入您要设置的密码:‘ pass
useradd $user &> /dev/null
echo $user创建成功
echo $pass | passwd --stdin $user &> /dev/null
echo $user密码设置成功
[[email protected] ~]# /root/user.sh
请输入您要创建的帐号:kobe
请输入您要设置的密码:248
kobe创建成功
kobe密码设置成功
-------------------------------------------------------------------------------------------
什么是变量
以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力
设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名,echo ${变量名}
变量的种类
位置变量
在执行脚本时提供的命令行参数(非交互式传值)
$加数字($1、$2、$3.....):脚本文件名后面带有参数的默认变量
[[email protected] ~]# vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10} #显示超过两位数的值要加{}
echo ${11}
echo $21 #不加{}则显示前一位的值再加后一位的值
[[email protected] ~]# /root/2.sh haha benniu xixi hehe lele dc tc dz tz 100 200
haha
benniu
xixi
100 #显示第十个值为100
200 #显示第十个值为200
benniu1 #显示第二个值加个1为benniu1
[[email protected] ~]# vim /root/3.sh
#!/bin/bash
cat -n $1 | head -$2
[[email protected] ~]# /root/3.sh /etc/passwd 2
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
预定义变量
用来保存脚本程序的执行信息
– 直接使用这些变量
– 不能直接为这些变量赋值
$# 已加载的位置变量的个数
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
[[email protected] ~]# vim /root/2.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo ${10}
echo ${11}
echo $#
echo $*
[[email protected] ~]# /root/2.sh 1 2 3 4 5 6 7 8 9 10 11
1
2
3
10
11
21
11 #显示已加载的位置变量的个数为11
1 2 3 4 5 6 7 8 9 10 11 #显示所有位置变量的值
----------------------------------------------------------------------------------------
运算
[[email protected] ~]# expr 10 / 3
[[email protected] ~]# expr 10 \* 3 #单独*显示语法错误,前面加\表示乘号
[[email protected] ~]# expr 1 + 2
[[email protected] ~]# expr 3 - 1
[[email protected] ~]# expr 10 % 3 #取余数 运算
$() :将()里命令的输出结果,作为参数显示
[[email protected] opt]# date
[[email protected] opt]# date +%F #只显示年月日
[[email protected] opt]# cd /opt
[[email protected] opt]# mkdir $(date +%F)
[[email protected] opt]# ls
2017-11-07
[[email protected] opt]# mkdir mydir-$(date +%F)
[[email protected] opt]# ls
2017-11-07 mydir-2017-11-07
[[email protected] opt]# mkdir MariaDB-$(date +%F)
[[email protected] opt]# ls
2017-11-07 MariaDB-2017-11-07 mydir-2017-11-07
[[email protected] opt]# mkdir $(hostname)-$(date +%F)
[[email protected] opt]# ls
2017-11-07 mydir-2017-11-07 MariaDB-2017-11-07 server0.example.com-2017-11-07
-------------------------------------------------------------------------------------------
常用的测试选项
检查文件状态
-e:文档存在为真
-d:文档存在且为目录为真
-f:文档存在且为文件为真
-r:文档存在且有读取权限为真
-w:文档存在且有写入权限为真
-x:文档存在且有执行权限为真
比较整数大小(带e都有等于二字,g代表大于,l代表小于)
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
字符串比对
== :相等
!=:不相等
----------------------------------------------------------------------------------------
if单分支语句
if [ 条件测试 ] ; then #[]里一定要有空格
命令序列xx
else
命令序列yy
fi
[[email protected] /]# vim /root/5.sh
#!/bin/bash
if [ $1 -eq $2 ];then
echo hello
else
echo hi
fi
[[email protected] /]# /root/5.sh 1 1
hello
[[email protected] /]# /root/5.sh 1 2
hi
请书写一个脚本:
用户输入一个IP地址(read),判断是否可以与该IP地址通信,能通则输出 "IP ok" 否则 输出 "IP no"
[[email protected] /]# vim /root/6.sh
#!/bin/bash
read -p ‘请输入一个IP地址:‘ ip #变量为ip
ping -c 2 $ip &> /dev/null
if [ $? -eq 0 ];then
echo ${ip} ok
else
echo ${ip} no
fi
[[email protected] /]# /root/6.sh
请输入一个IP地址:127.0.0.1
127.0.0.1 ok
[[email protected] ~]# /root/6.sh
请输入一个IP地址:1.1.1.1
1.1.1.1 no
-----------------------------------------------------------------------------------------
if多分支语句
if [条件测试1] ; then
命令序列xx
elif [条件测试2] ; then
命令序列yy
else
命令序列zz
fi
成绩 大于等于90 优秀
大于等于80 良好
大于等于70 及格
大于等于60 仍需努力
60以下 在牛的肖邦,也弹不出哥忧伤
[[email protected] ~]# vim /root/8.sh
#!/bin/bash
read -p ‘请输入您的成绩:‘ num
if [ $num -gt 100 ];then #大于100分
echo 成绩有误
elif [ $num -lt 0 ];then #小于0分
echo 成绩有误
elif [ $num -ge 90 ];then
echo 优秀
elif [ $num -ge 80 ];then
echo 良好
elif [ $num -ge 70 ];then
echo 及格
elif [ $num -ge 60 ];then
echo 仍需努力
else
echo 在牛的肖邦,也弹不出哥忧伤
fi
-----------------------------------------------------------------------------------------
在 server0 上创建 /root/foo.sh 脚本
1)当运行/root/foo.sh redhat,输出为fedora
2)当运行/root/foo.sh fedora,输出为redhat
3)当没有任何参数或者参数不是 redhat 或者
fedora时,其错误输出产生以下信息:
/root/foo.sh redhat|fedora
‘ ‘:把所有的特殊字符,当作普通文本字符输出
[[email protected] ~]# vim /root/foo.sh
#!/bin/bash
if [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘
fi
[[email protected] ~]# /root/foo.sh redhat
[[email protected] ~]# /root/foo.sh fedora
[[email protected] ~]# /root/foo.sh haha
#!/bin/bash
if [ $# -eq 0 ];then #表示脚本文件后位置变量的个数为0时,即没有任何参数(不输入参数)
echo ‘/root/foo.sh redhat|fedora‘
elif [ $1 == redhat ];then
echo fedora
elif [ $1 == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘
fi
" ":可以将 “没有” 变成 “ 空值”
#!/bin/bash
if [ "$1" == redhat ];then
echo fedora
elif [ "$1" == fedora ];then
echo redhat
else
echo ‘/root/foo.sh redhat|fedora‘ >&2 #将正确输出变成错误
exit 2 #脚本退出返回值,即上一行命令为错时echo$?显示不为0的指定值2
fi
-------------------------------------------------------------------------------------------
for循环结构
循环结构:将反复执行的语句,循环去执行
for 变量名 in 值列表
do
命令序列
done
[[email protected] /]# vim /root/for.sh
#!/bin/bash
for a in 1 2 3 4 5
do
useradd nsd$a
echo nsd$a创建成功
done
[[email protected] /]# vim /root/for02.sh
#!/bin/bash
for a in 1 2 3 4 5
do
echo hello
done
-------------------------------------------------------------------------------------------
案例5:编写一个批量添加用户脚本
在 server0 上创建 /root/batchusers 脚本
1)此脚本要求提供用户名列表文件作为参数
2)如果没有提供参数,此脚本应该给出提示
Usage: /root/batchusers,退出并返回相应值
3)如果提供一个不存在的文件,此脚本应该给出提
示 Input file not found,退出并返回相应值
4)新用户的登录Shell为 /bin/false,无需设置密码
5)用户列表测试文件:
http://classroom/pub/materials/userlist
# wget http://classroom/pub/materials/userlist
[[email protected] /]# vim /root/batchusers
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ ! -e $1 ];then # !表示不存在
echo ‘Input file not found‘ >&2
exit 2
fi
for a in $(cat $1)
do
useradd -s /bin/false $a
echo $a创建成功
done
-----------------------------------------------------------------------------------------
#!/bin/bash
if [ $# -eq 0 ];then
echo ‘Usage: /root/batchusers‘ >&2
exit 1
fi
if [ -e $1 ];then
for a in $(cat $1)
do
useradd -s /bin/false $a
echo $a创建成功
done
else
echo ‘Input file not found‘ >&2
exit 2
fi
以上是关于linux学习笔记--工程师技术:shell脚本基础的主要内容,如果未能解决你的问题,请参考以下文章