1.shell是什么
shell是一种脚本语言
可以使用逻辑判断、循环等语法
可以自定义函数
shell是系统命令的集合
shell脚本可以实现自动化运维,能大大增加我们的运维效率
2.shell脚本结构和执行
开头需要加#!/bin/bash
以#开头的行作为解释说明
脚本的名字以.sh结尾,用于区分这是一个shell脚本
[root@feature1 ~]# cat 1.sh
#!/bin/bash
touch /tmp/1.txt
chmod 600 /tmp/1.txt
mv /tmp/1.txt /tmp/2.txt
[root@feature1 ~]# bash 1.sh
[root@feature1 ~]# bash -x 1.sh
+ touch /tmp/1.txt
+ chmod 600 /tmp/1.txt
+ mv /tmp/1.txt /tmp/2.txt
[root@feature1 ~]# bash -n 1.sh
#-n 查看有没有语法错误
执行方法有两种
chmod +x 1.sh; ./1.sh
bash 1.sh
查看脚本执行过程 bash -x 1.sh
查看脚本是否语法错误 bash -n 1.sh
3.date命令
date +%Y-%m-%d, date +%y-%m-%d 年月日
date +%H:%M:%S = date +%T 时间
[root@feature1 ~]# date +%Y-%m-%d
2019-03-08
[root@feature1 ~]# date +%Y
2019
[root@feature1 ~]# date +%y
19
[root@feature1 ~]# date +%m
03
[root@feature1 ~]# date +%d
08
[root@feature1 ~]# date +%M
43
[root@feature1 ~]# date +%H
15
[root@feature1 ~]# date +%S
41
[root@feature1 ~]# date +%F
2019-03-08
[root@feature1 ~]# date +%T
15:43:51
[root@feature1 ~]# date +%Y@%m@%d
2019@03@08
date +%s 时间戳
[root@feature1 ~]# date +%s
1552031164
date -d @1504620492
[root@feature1 ~]# date -d @1
Thu Jan 1 08:00:01 CST 1970
[root@feature1 ~]# date -d @1552031164
Fri Mar 8 15:46:04 CST 2019
date -d "+1day" 一天后
date -d "-1 day" 一天前
date -d "-1 month" 一月前
date -d "-1 min" 一分钟前
[root@feature1 ~]# date -d "+1day"
Sat Mar 9 15:48:31 CST 2019
[root@feature1 ~]# date -d "-1day"
Thu Mar 7 15:48:40 CST 2019
[root@feature1 ~]# date -d "-1hour"
Fri Mar 8 14:48:47 CST 2019
[root@feature1 ~]# date -d "+hour"
Fri Mar 8 16:48:52 CST 2019
[root@feature1 ~]# date -d "+week"
Fri Mar 15 15:48:59 CST 2019
date +%w, date +%W 星期
[root@feature1 ~]# date +%w
5
[root@feature1 ~]# date +%W
09
[root@feature1 ~]# date -d "-70day" +%W
52
[root@feature1 ~]# date -d "-50day" +%W
02
4.shell脚本中的变量
当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
使用条件语句时,常使用变量 if [ $a -gt 1 ]; then ... ; fi
引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`
写和用户交互的脚本时,变量也是必不可少的
read -p "Input a number: " n; echo $n 如果没写这个n,可以直接使用$REPLY
内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 .... $#表示参数个数
[root@feature1 ~]# a=`date +%w`
[root@feature1 ~]# echo $a
[root@feature1 ~]# a=$(date +%W)
[root@feature1 ~]# echo $a
09
[root@feature1 ~]# read -p "请输入一个数字:" n
请输入一个数字:8
[root@feature1 ~]# echo $n
8
[root@feature1 ~]# read -p "请输入一个数字:"
请输入一个数字:6
[root@feature1 ~]# echo $REPLY
6
[root@feature1 ~]# vim 2.sh
#!/bin/bash
echo "\$1=$1"
echo "第二个参数是$2"
echo "第二个参数是$3"
echo "本脚本一共有$#个参数"
[root@feature1 ~]# sh 2.sh 1 2 3 a
$1=1
第二个参数是2
第二个参数是3
本脚本一共有4个参数
[root@feature1 ~]# sh 2.sh aa bb cc dd
$1=aa
第二个参数是bb
第二个参数是cc
本脚本一共有4个参数
[root@feature1 ~]# sh 2.sh aa bb cc dd 55
$1=aa
第二个参数是bb
第二个参数是cc
本脚本一共有5个参数
[root@feature1 ~]# sh 2.sh aa bb
$1=aa
第二个参数是bb
第二个参数是
本脚本一共有2个参数
[root@feature1 ~]# cat 2.sh
#!/bin/bash
echo "\$1=$1"
echo "第二个参数是$2"
echo "第二个参数是$3"
echo "本脚本一共有$#个参数"
echo “\$0是$0”
[root@feature1 ~]# sh 2.sh 2 o
$1=2
第二个参数是o
第二个参数是
本脚本一共有2个参数
“$0是2.sh”
[root@feature1 ~]# chmod +x 2.sh
[root@feature1 ~]# ./2.sh
$1=
第二个参数是
第二个参数是
本脚本一共有0个参数
“$0是./2.sh”
数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
[root@feature1 ~]# a=1
[root@feature1 ~]# b=2
[root@feature1 ~]# c=$(($a+$b))
[root@feature1 ~]# echo $c
3
[root@feature1 ~]# c=$[$a+$b]
[root@feature1 ~]# echo $c
3
# $(($a+$b))=$[$a+$b]
5.shell中的逻辑判断
格式1:if 条件 ; then 语句; fi
格式2:if 条件; then 语句; else 语句; fi
格式3:if …; then … ;elif …; then …; else …; fi
逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格
[root@feature1 ~]# vim if1.sh
#!/bin/bash
a=10
if [ $a -gt 5]
then
echo ok
fi
[root@feature1 ~]# sh -x if1.sh
+ a=10
+ '[' 10 -gt '5]'
if1.sh: line 3: [: missing `]'
#直接命令行也是可以的。换行用;
[root@feature1 ~]# a=10; if [ $a -gt 5 ]; then echo ok; fi
ok
[root@feature1 ~]# a=10
[root@feature1 ~]# if [ $a -gt 5 ]
> then
> echo ok
> fi
ok
[root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; fi
[root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; else echo "not ok"; fi
ok
[root@feature1 ~]# vim if1.sh
[root@feature1 ~]# cat if1.sh
#!/bin/bash
a=10
if [ $a -gt 5]
then
echo ok
else
echo "not ok"
fi
[root@feature1 ~]# vim if2.sh
[root@feature1 ~]# cat if2.sh
#!/bin/bash
a=2
if [ $a -gt 5 ]
then
echo ok
elif [ $a -gt 3 ]
then
echo "very ok"
else
echo "not ok"
fi
[root@feature1 ~]# sh -x if2.sh
+ a=2
+ '[' 2 -gt 5 ']'
+ '[' 2 -gt 3 ']'
+ echo 'not ok'
not ok
#逻辑判断的嵌套
[root@feature1 ~]# vim if3.sh
[root@feature1 ~]# cat if3.sh
#!/bin/bash
a=10
if [ $a -gt 5 ]
then
if [ $a -lt 20 ]
then
echo "ok"
else
echo "very ok"
fi
else
echo "not ok"
fi
[root@feature1 ~]# sh -x if3.sh
+ a=10
+ '[' 10 -gt 5 ']'
+ '[' 10 -lt 20 ']'
+ echo ok
ok
可以使用 && || 结合多个条件
if [ $a -gt 5 ] && [ $a -lt 10 ]; then == if [ $a -get 5 -a $a -lt 10]
if [ $b -gt 5 ] || [ $b -lt 3 ]; then == if [$b -gt 5 -0 $ -lt 3]
6.if 判断文件、目录属性
[ -f file ]判断是否是普通文件,且存在
[ -d file ] 判断是否是目录,且存在
[ -e file ] 判断文件或目录是否存在
[ -r file ] 判断文件是否可读
[ -w file ] 判断文件是否可写
[ -x file ] 判断文件是否可执行
[root@feature1 ~]# if [ -f 1.sh www.xycheng178.com]; then echo 1; fi
1
[root@feature1 ~]# if [ -d 1.sh ]; then echo 1; fi
[root@feature1 ~]# ls -l /tmp/mysql.sock
srwxrwxrwx. 1 mysql mysql 0 Mar 5 09:38 /tmp/mysql.sock
[root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ -f /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
[root@feature1 ~]# if [ www.yongshi123.cn-e /tmp/mysql.sock ]; then echo 1; fi
1
[root@feature1 ~]# if [ www.dfgjpt.com-e /tmp/ ]; then echo 1; fi
1
[root@feature1 ~]# if [ www.68076.cn -e /tmp/12 ]; then echo 1; fi
#判断/root/ 下有没有ab.sh 没有的话 执行echo "1111">ab.sh
[root@feature1 ~]# if [www.yinmaoyule178.com -f /root/ab.sh ]; then echo 1; else echo "1111" >ab.sh; fi
[root@feature1 ~]# cat ab.sh
1111
root用户对文件的读写比较特殊,即使一个文件没有给root用户读或者写的权限,root用户照样可以读或者写
7.if判断的一些特殊用法
if [ -z "$a" ] 这个表示当变量a的值为空时会怎么样
if [ -n "$a" ] 表示当变量a的值不为空
[root@feature1 ~]# a=
[root@feature1 ~]# echo $a
[root@feature1 ~]# if [ -z "$a" ]; then echo "a为空"; fi
a为空
[root@feature1 ~]# a=1
[root@feature1 ~]# if [ -z "$a" ]; then echo "a为空"; fi
#加!是取反
[root@feature1 ~]# if [ ! -z "$a" ]; then echo "a不为空"; fi
a不为空
[root@feature1 ~]# if [ www.120xh.cn-n "$a"www.68079.cn ]; then echo "a不为空"; fi
a不为空
[root@feature1 ~]# ls 123
[root@feature1 ~]# echo $?
0
[root@feature1 ~]# ls 35
ls: cannot access 35: No such file or directory
[root@feature1 ~]# echo $?
2
[root@feature1 ~]# if ! ls 35 ; then echo "指令执行不成功"; fi
ls: cannot access 35: No such file or directory
指令执行不成功
[root@feature1 ~]# if !www.dfgjyl.cn ls 35 &>/dev/null; then echo "指令执行不成功"; fi
指令执行不成功
if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行时会怎么样 if [ ! -e file ]; then 表示文件不存在时会怎么样
[root@feature1 ~]# if grep -q www.jiahuayulpt.com'123' 1.sh ; then echo "1.sh文件中包含有123关键字"; fi
if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=这样的符号
[root@feature1 ~]# if (($a>2))www.thd178.com/ ; then echo "a大于2"; fi
[root@feature1 ~]# a=10
[root@feature1 ~]# if (($a>2)); then echo "a大于2"; fi
相关文章
- 【一天一道LeetCode】#109. Convert Sorted List to Binary Search Tree
- 基于 React + NodeJS + Express + MongoDB 开发的一个社区系统
- Scrapy学习之路(一)————环境配置
- JavaScript 全栈工程师培训教程 - 阮一峰
- 【数据库】10.0 MySQL常用语句(一)
- centos7下安装python3 解决openssl等一系列问题
- BITED-Windows8应用开发学习札记之一:Win8应用开发入门
- C#控制定位Word光标移动到任意行或者最后一行,取得光标位置等操作
- Openlayers系列(一)关于地图投影的理解
- js返回到上一个页面刷新与不刷新的写法