shell 一
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
shell 一的更多相关文章
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- Shell特殊变量
$ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...
- shell变量
定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...
- 第一个shell脚本
打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...
- shell简介
Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...
- Shell碎碎念
1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...
- MongoDB学习笔记二—Shell操作
数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...
- 使用C#给Linux写Shell脚本
在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...
- Linux环境下shell和vim中乱码原因及消除办法
shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...
- 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行
背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...
随机推荐
- CF1060E Sergey and Subways 假的点分治
题目传送门:http://codeforces.com/problemset/problem/1060/D 题意:给出$N$个点的一棵树,现在将距离为$2$的点之间连一条边,求所有点对之间最短路的和, ...
- JVM调优——之CMS 常见参数解析
最近在学习使用CMS这个GC,这里记录下常用的参数. 1. UseCMSCompactAtFullCollection 与 CMSFullGCsBeforeCompaction 有一点需要注意的是:C ...
- 机器学习sklearn19.0聚类算法——Kmeans算法
一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...
- python第二周
第二周,PYTHON图形绘制 一,计算机技术的演进发展 1946-1981.从第一台计算机的诞生到IBM的PC机的出现,我们称之为”计算机系统结构时代“.————这个时代重点在解决计算能力问题 198 ...
- Duplicate entry * for key *
一.问题 插入数据时报错 Duplicate entry * for key * 二.分析 建表语句 CREATE TABLE `t_product_result_config` ( `id` var ...
- Nginx+Tomcat+Memcached部署
环境清单列表:(因为只有三台电脑,所有把Nginx和memcached放到一起) 应用服务器1:192.168.51.10: 应用服务器2:192.168.55.110: memcached服务器:1 ...
- 修改docker的地址为阿里云源
https://blog.csdn.net/jacabe/article/details/78575316
- 【2016.3.16】作业 VS2015安装&单元测试(1)
首先说下本机配置. CPU:Intel Atom x5-z8300 @1.44GHz 内存:2GB 操作系统:Windows10 家庭版 32位 硬盘:32GB 然后开始怒装visual studio ...
- 12.11 Daily Scrum
Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表. 邓亚梅 美化搜索框UI. 美 ...
- Maven遇到github引用的项目有bug怎么办?
Maven遇到github引用的项目有bug,自己想要修复/作者已经修复了但是还没有版本出来. 一个maven的做法 git clone 该项目(可能直接下载zip比较快). 在项目中mvn inst ...