2018年8月9日
0:31
cat /etc/shells
方法一:脚本文件路径(需要执行权:x权限)
例如:
cd /root
vi first.sh
cd /boot/
pwd
ls -lh vml*
chmod +x first.sh(赋予first.sh脚本文件执行权)
./first.sh
方法二:sh 脚本文件路径
例如:
vi server.sh
service $1 start
sh server.sh crond(crond为服务名)
方法三:source 脚本文件路径
例如:
source server.sh crond
交互式设备:
标准输入:键盘(默认) /dev/stdin(设备文件) 0(编号)
标准输出:显示器(默认) /dev/stdout(设备文件) 1(编号)
错误输出:显示器(默认) /dev/stderr(设备文件) 2(编号)
重定向类型:
输入重定向:< (从文件读取数据)
标准输出(正确结果)重定向:
> (将输出结果保存至文件,并覆盖原内容)
>> (将输出结果追加至原内容的末尾处)
错误输出(正确结果)重定向:
2> (将输出结果保存至文件,并覆盖原内容)
2>> (将输出结果追加至原内容的末尾处)
混合输出(正确、错误)重定向:
&> (将输出结果保存至文件,并覆盖原内容)
&>> (将输出结果追加至原内容的末尾处)
例如:
grep “bash$” /etc/passwd | awk -F: ‘{print $1,$7}’
(awk用于截取输出内容,-F为指定分隔符,例子中的分隔符为冒号)
(print为打印输出,$1,$7为位置变量,表示:第1列和第7列)
(整个命令结果是只显示原屏幕的:第1列和第7列的内容)
1)变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改
2)定义变量:变量名=变量值
(变量名以字母或下划线开头,区分大小写,建议全大写)
3)查看变量的值:echo $变量名
例如:
Product=AIX
Version=1.0
echo $Product
echo $Product $Version
4)赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果
例如:
num1=100
num2=200
num3="$num2"
num4='$num2'
LS=`ls /root`
echo $num3
echo $num4
echo $LS
5)从键盘输入内容为变量赋值
格式: read [-p "提示信息"] 变量名
例如:
read NAME(无友好提示,不知道该输入什么内容)
(从键盘输入的内容赋值给变量NAME)
read "请输入您的姓名" NAME(有提示,提示内容为:请输入您的姓名)
(从键盘输入的内容赋值给变量NAME)
6)设置变量的作用范围
格式1:export 变量名 ...(提升已有变量为全局变量)
格式2: export 变量名=变量值 ...(定义新变量的同时,提升其为全局变量)
例如:
Product=AIX
Version=1.0
export Product
bash
echo $Product(输出结果为:AIX)
echo $Version(输出结果为:空)
exit
7)整数变量的运算
格式:expr 变量1 运算符 变量2 [运算符 变量3] ...
常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: %
例如:
num1=100
num2=200
sum1=`expr $num1 + $num2`
product1=`expr $num1 \* $num2`
echo $sum1 $product1
也可以:
sum2=$((num1+num2))
product2=$((num1*num2))
echo $sum2 $product2
8)环境变量
由系统提前创建,用来设置用户的工作环境
配置文件:
/etc/profile:定义全局的系统环境变量
~/.bash_profile(定义不同用户的环境变量,该文件具有隐藏属性)
例如:
ls /root(无法找到.bash_profile文件,文件处于隐藏状态)
ls -a /root(-a选项,也可以-A,都可以看到隐藏文件)
(前面带点的文件或目录,就自动具有隐藏属性)
(我们也可以自己创建带点的文件或目录)
常见的环境变量:
PWD(定义工作路径)、PATH(命令的搜索路径)
USER(定义登录的用户名) 、SHELL(定义shell)、HOME(定义家目录)
例如:
echo $PATH(查看显示结果)
PATH="$PATH:/root"
echo $PATH(再次查看显示结果,前后对比)
9)位置变量:表示为 $n,n为1~9之间的数字
例如:
cd /root
vi copy.sh
#!/bin/bash
cp $1 $2
chmod +x copy.sh
./copy.sh /etc/yum.conf /root
(脚本中的位置变量$1的值为:/etc/yum.conf,$2的值为:/root)
10)预定义变量
$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错
$0:当前执行的进程/程序名
例如:
cd /root
vi mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*”
./mybak.sh /etc/passwd /etc/shadow (查看结果)
10)脚本应用思路
第一:具体命令、及其执行顺序
第二:组织任务过程 编写脚本
第三:设置计划任务(控制时间tab,调用任务脚本)
Crontab -e
30 2 * * * /bak.sh(脚本或目录命令)
分 小时 日 月 年
Service crond start 计划任务服务开启
Shell 逻辑命令
2018年8月9日
11:39
测试特定的表达式是否成立,如果成立返回0值,不成立返回1.
格式1:test 条件表达式
格式2:[ 条件表达式 ]
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
[root@localhost ~]# Str1="abc"
[root@localhost ~]# Str2="ABC"
[root@localhost ~]# [ $Str1 = $Str2 ] && echo YES || echo NO
NO
[root@localhost ~]# [ $Str1 != $Str2 ] && echo YES || echo NO
YES
[root@localhost ~]# [ -z $Str2 ] && echo YES || echo NO
NO
[root@localhost ~]# [ -z "" ] && echo YES || echo NO
YES
if
then
elif
then
else
fi
for
for 变量名 in 取值列表
do
命令序列
done
while 条件测试操作
do
命令序列
done
例:
case
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
….
*)(表示通配)
默认命令序列
esac
例:
案例一:判断磁盘已用空间比例
输出结果
案例二:判断Httpd服务是否开启
#!/bin/bash
netstat -anpt | grep httpd &> /dev/null
if [ $? -eq 0 ]
then
echo "Httpd服务已经启动!"
else
rpm -q httpd &> /dev/null
if [ $? -eq 0 ]
then
service httpd start
else
mount /dev/cdrom /mnt
rpm -ivh /mnt/Packages/httpd-2.2.15-29.el6_4.x86_64.rpm
fi
fi
案例三:根据输入的成绩值,判断等级
输出结果
案例四:网络连通性测试
结果
案例五:从IP地址列表文件中,测试主机的连通性
案例六:批量创建100个用户,用户名为stu开头字符串开头,后跟1-100的编号,初始密码均为:123456
#!/bin/bash
for((i=1;i<=100;i++))
do
useradd stu$i &> /dev/null
echo "123456" | password --stdin stu$i
done
案例七:批量创建用户,用户名从文件列表中获取,初始密码均为:123456
#!/bin/bash
UserList=$(cat /root/userlist.txt)
for User in $UserList
do
useradd $UserList &> /dev/null
echo "123456" | password --stdin $UserList
done
案例八:统计1-100之和
#!/bin/bash
sum=0
for((i=1;i<=100;i++))
do
sum=$((sum+i))
done
echo $sum
案例九: 猜价格游戏
案例10:MySQL数据库备份脚本
#!/bin/bash
# 这是一个简化的MqSQL数据库逻辑备份脚本
# 1.定义数据库链接,目标库信息
MY_USER="operator"
MY_PASS="pwd123"
MY_HOST="192.168.4.11"
MY_CONN="-u $MY_USER -p$MY_PASS -h $MY_HOST"
MY_DB1="studydb"
MY_DB2="coursedb"
# 2.定义备份目录,工具,时间,文件名主体
BF_DIR="/mysql.benfen/"
BF_CMD="/usr/bin/mysqldump"
BF_TIME='date +%Y%m%d-%H%M'
NAME_1="$MY_DB1-$BF_TIME"
NAME_2="$MY_DB2-$BF_TIME"
# 3.先导出为.sql脚本,然后再进行压缩(打包后删除原文件)
cd $BF_DIR
$BF_CMD $MY_CONN --databases $MY_DB1 > $NAME_1.sql
$BF_CMD $MY_CONN --databases $MY_DB2 > $NAME_2.sql
/bin/tar zcf $NAME_1.tar.gz $NAME_1.sql --remove &> /dev/null
/bin/tar zcf $NAME_2.tar.gz $NAME_2.sql --remove &> /dev/null
案例11:
#!/bin/bash
case $2 in
start)
service $1 start
;;
stop)
service $1 stop
;;
restart)
service $1 stop
service $1 start
;;
status)
service $1 status
;;
reload)
service $1 reload
;;
*)
echo "语法错误!"
echo "service $1 start|stop|restart|status|reload"
esac
案例12:设置网卡静态IP地址等信息
#!/bin/bash
#获取网卡的设备名称
IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')
#获取网卡的MAC地址信息
MAC=$(ifconfig | grep "eth" | awk '{print $5}')
#生成网卡设备的配置文件,并重启网络服务,使配置文件生效
echo "DEVICE=$IFNAME
HWADDR=$MAC
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.120.120
NETMASK=255.255.255.0
GATEWAY=192.168.120.254
DNS1=8.8.8.8
DNS2=114.114.114.114" > /etc/sysconfig/network-scripts/ifcfg-$IFNAME
service network restart
案例13:设置网卡静态IP地址等信息(通过键盘输入)
#!/bin/bash
IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')
MAC=$(ifconfig | grep "eth" | awk '{print $5}')
read -p "请输入网卡IP地址:" IP
read -p "请输入子网掩码:" MASK
read -p "请输入网关地址:" GW
read -p "请输入首选DNS地址:" DNS1
read -p "请输入备用DNS地址:" DNS2
echo "DEVICE=$IFNAME
HWADDR=$MAC
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=$IP
NETMASK=$MASK
GATEWAY=$GW
DNS1=$DNS1
DNS2=$DNS2" > /etc/sysconfig/network-scripts/ifcfg-$IFNAME
service network restart
案例14:将克隆后的虚拟机网卡设备名称由:eth1、eth2、eth3...改为eth0
思路如下:
修改网卡设备名为:eth0
修改下列文件:
/etc/udev/rules.d/70-persistent-net.rules
对原始的eth0所在行加注释:如下所示:
#SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:3b:7d:a4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
再将另一个设备名改为:eth0,如下所示:
该行原内容为:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0f:85:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
修改后为:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0f:85:66", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
最后,执行重启命令:reboot
#!/bin/bash
#获取网卡的设备名称
IFNAME=$(ifconfig | grep "eth" | awk '{print $1}')
#获取网卡的MAC地址信息
MAC=$(ifconfig | grep "eth" | awk '{print $5}')
#注释原有的eth0所在行
sed -i "/eth0/s/SUBSYSTEM/#SUBSYSTEM" /etc/udev/rules.d/70-persistent-net.rules
#将网卡的新设备名改为:eth0
sed "s/$IFNAME/eth0" /etc/udev/rules.d/70-persistent-net.rules &> /dev/null
#生成网卡设备的配置文件,并重启网络服务,使配置文件生效
echo "DEVICE=eth0
HWADDR=$MAC
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.120.120
NETMASK=255.255.255.0
GATEWAY=192.168.120.254
DNS1=8.8.8.8
DNS2=114.114.114.114" > /etc/sysconfig/network-scripts/ifcfg-eth0
service network restart
reboot