一、编写一个shell
bash -x filename 可以查看执行过程的,可以用来排错。
shell脚本是将完成一个任务的所有命令按照执行先后顺序,自上而下写到一个文本文件中,然后给与执行权限。
例:安装一个nginx,vim一个文本文件,写入以下内容
yum -y install wget gcc pcre-devel zlib-devel (安装依赖先)
wget http://nginx.org/download/nginx-1.16.0.tar.gz (下载nginx)
tar xf nginx-1.16.0.tar.gz (解压nginx包)
cd nginx-1.16.0(进去目录)
./configure --prefix=/usr/local(源码编译安装)
make -j 4(四个cpu运行)
make install
给予执行权限 chmod 700 文本文件名称 (切记权限不要给予777)
当安装好,启动nginx不成功就要考虑一下防火墙有没有关闭。
以上就是一个shell脚本简单的诠释。
二、shell脚本书写规范
1、shell中要有以下的基本的规范:
#是用于注释(在shell中不要写中文或者出现中文)
1)定义脚本环境
#!是定义脚本在哪个环境变量中运行,是特例
2)脚本信息
#脚本是那个人写的:Author
#创建这个脚本的时间:Created Time
#分发版本号: Release:1.0
#描述清楚这个脚本是用于干嘛的 :Script Description: nginx
3)脚本组成
#解释环境 写法还有这些 #!/usr/bin/env bash 或者 python 或者 perl
#注释说明
#执行代码
2、运行脚本
~1 给执行权限 格式 chmod u+x filename
~2解释器直接运行 ,不用给予权限 格式 bash filename
3、shell中特殊符号
~ 家目录 ! 执行历史命令 !!执行上一条历史命令
$ 变量中取内容符 echo $hello
+ - * / % 对应数学运算 加 减 乘 除 取余数
& 后台运行
* 星号是通配符 匹配所有
? 问号也是通配符 匹配除回车以外的一个字符
:是可以在shell中一行执行多个命令用分号隔开
| 管道符 上一个命令的输出作为下一个命令的输入
\ 转义字符
‘’ 反引号 命令中执行的命令
‘’ 单引号脚本中字符串要用单引号引起来,不可以解释变量
“”双引号出现字符串可以用双引号引起来
> 重定向输入 覆盖原数据
>> 重定向追加输入,在原始数据尾端添加
< 重定向输出 wc -l < /ect/passwd
<< 重定向追加输出 fdisk /dev/sdb <<EOF 、、、、、、、 EOF
1>硬盘分区脚本演示:
#!/usr/bin/bash
#Author:
#Created Time:
#Scrip Description: harddisk partition script
fdisk /dev/sdb <<EOF
n
p
3
+534M
w
EOF
2>内存使用率脚本
echo "当前内存使用率: 'echo "scale=2;141*100/7966"|'bc'%"
3>输入输出交互式小程序脚本演示:
#!/usr/bin/bash
clear
echo "Centos Linux 7 (Core)"
echo -e "Kernel 'uname -r' an 'uname'\n"
echo -n -e "$HOSTNAME login: "
read acc
read -p "password: "
read pw
4>声明一个关联数组脚本演示
declare -A ass_array1
declare -A ass_array2
ass_array1[name]='bai'
ass_array1[age]=18
echo ${assarray1[name]}
ass_array2=([name]='ayitula' [age]=20)
echo ${assarray2[name]}
3、运算
1)数学运算
-eq 等于 -gt 大于 -It 小于
-ge 大于或等于 -le 小于或等于 -ne 不等于
脚本演示:
NUM1=`echo "1.5*10" | bc | cut -d "." -f1`
NUM2=$((2*10))
test $NUM1 -gt $NUM2;echo $?
三、shell语句
判断语句
1、单if语句
if [condition] #condition 值为ture或者false
then
commands
fi
语句的大意
假如 条件是真
那么
执行commands代码块
结束
2、if-then-else语句
if [condition]
then
commands1
else
commands2
fi
语句翻译
假如 条件为真
那么
执行commands1代码块
否则
执行commands2代码块
结束
3、if-then-elif 语句
用于两个以上的判断
if [ condition 1 ]
then
commands1
elif [ condition 2]
then
commands2
...............
else
commands x
fi
翻译过来
假如 条件1为真
那么
执行代码块1
假如条件2真
那么
执行代码块2
以上代码类推下去
否则 没有一个满足
执行代码块x
结束
流程控制
for条件循环语句一(知道循环次数就要用for)
for var in value1 value2
do
commands
done
语句二 c语言写法
for ((变量;条件;自增减运算 ))
do
代码块
done
循环控制语句
sleep N 脚本执行到该步休眠N秒
shell演示
echo -n "倒计时:"
for i in `seq 9 -1 1`
do
echo -n -e "\b$i"
sheep 1
done
continue 跳过循环中的某次循环
break 跳出循环继续执行后续代码
while循环语句(如果不知道代码要循环多少次,就要用while)
while [ condition ] 这里条件为真才会循环,条件为假while停止循环。
do
commands
done
演示代码
丈母娘选女婿
1)姑娘带第一个男朋友回来
read -p "money : " money
read -p "car : " car_num
read -p "house : " house
2)第一个男朋友不满足,进入循环 开始选择模式
while [ $money -lt 100000 ] || [$car_num -lt 1 ] || { $house -lt 1 ]
do
echo " 不行 "
read -p "money:" money
read -p "car:" car_num
read -p "house:" house
done
echo "给你了"
循环控制与语句嵌套
1)嵌套 if for while
2)循环控制 sleep break continue
99乘法表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9 、、、、、、打印出来的排序是这样,前面是m 后是n
代码块
n=1
while [$n -lt 10 ] ; do
for ((m=1;m<=$n;m++ ));do
echo -n -e "$m * $n =$((n*m))\t"
done
echo
n=$((n+1))
done
until循环语句 与while相反,条件为假的时候开始执行,条件为真就停止执行。
语法
until [ condition ] 切记是条件假才会开始执行
do
commands
done
case语句
在生活中,我们总会要对一些事情做出很多选择,好比你去相亲,脑子了有个预想方案:
第一次见对方父亲 应该叫伯父好
第一次见对方母亲 应该叫伯母好
第一次见对方奶奶 应该叫奶奶好、、、
这就是case的特点 根据不同情况执行不同方案 千变万化的
语法
case 变量 in
条件1)
执行代码块1
;;
条件2)
执行代码块2
;;
、、、、、、、、、、、
esac
注意 每个代码完毕要以;;结尾代表结束,case结尾要以倒过来的esac来结束
脚本演示
case $1 in
zmn | ZMN
echo "伯母好"
echo "伯母辛苦了"
;;
lzr | LZR
echo "伯父好"
echo"伯父真帅"
;;
lnn | LNN
echo "奶奶好"
echo “奶奶吉祥”
;;
*)
echo "USERGE: $0 zmm | lzr | lnn "
;;
esac
函数的语法
模块化方便管理,节省内存,排插简单,改变代码的执行顺序
1)
函数名 () {
代码块
return N
}
2)
function 函数名 {
代码块
return N
}
脚本演示
1)先定义函数
start () {
echo "Apache start ........... [ok]"
}
stop () {
echo "Apache stop ........... [ok]"
}
2)调用函数
stop
start
start (顺序可以调乱)