Shell脚本基础及应用

  • 一、shell变量
  • 二、判断语句
    • if语句
    • if语句实战
  • 三、循环语句
    • for循环
    • while循环
    • until循环
  • 四、选择语句
    • case语句
  • 五、四剑客
    • grep
    • sed
    • awk
    • find

一、shell变量

一、 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name=“runoob.com”

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

二、 系统变量的意义: $?判断上一条shell命令是否正确 $#判断参数的个数 $*打印所有脚本后的参数 [root@docker1~]# cat a.sh
#! /bin/bash

参数的意义

$0 当前脚本名字
$1 脚本后第一个参数
$2 脚本后第二个参数
$?上一条是否正确,正确为0反之为1 $# 脚本后面参数的个数
$* 脚本后面所有的参数

echo "this \$0  value is $0"
echo "this \$1  value is $1"
echo "this \$2  value is $2"
echo "this \$?  value is $?"
echo "this \$#  value is $#"
echo "this \$*  value is $*"[root@docker1 ~]# sh a.sh 12 34
this $0  value is a.sh
this $1  value is 12
this $2  value is 34
this $?  value is 0
this $#  value is 2
this $*  value is 12 34
小实例
菜单栏实例:
[root@docker1 ~]# cat b.sh
#! /bin/bash
echo -e '\033[32mPlease select menu follow:echo "1)安装Apache服务器."
echo "2)安装Mysql服务器."
echo "3)安装PHP服务器."
echo "4)配置Lamp网站架构."---------------------------------------
\033[0m'[root@docker1 ~]# sh b.sh
Please select menu follow:echo "1)安装Apache服务器."
echo "2)安装Mysql服务器."
echo "3)安装PHP服务器."
echo "4)配置Lamp网站架构."----------------------------------

二、判断语句

if语句

1、if语句实例
shell里,(())表示比较大小
if 语法格式为:
if 表达式;then
表达式
else
表达式
fi

if语句判断数字大小:

[root@docker1 ~]# cat c.sh
#! /bin/bashNUM1=100
NUM2=200if (($NUM1 > $NUM2));thenecho "This $NUM1 great $NUM2"
elseecho "This $NUM1 little $NUM2"
fi
[root@docker1 ~]# sh c.sh
This 100 little 200
  • 逻辑运算符:
    -f 判断文件是否存在
    -d 判断目录是否存在
    -eq 等于
    -ne 不等
    -lt 小于
    -gt 大于
    -le 小于等于
    -ge 大于等于
    -a 双方都成立,逻辑表达式
    -o 单方成立
    -z 空字符串
 实例: 1)判断一个目录是否存在 [root@docker1 ~]# cat d.sh #! /bin/bash# 判断文件是否存在
DIR=/data/20200522
if [ ! -d /data/$DIR ]; thenmkdir -p /data/$DIRecho -e "\033[32mThis $DIR is create success!\033[0m"
elseecho -e "\033[32mThis $DIR is already exist,Please exit.\033[0m"
fi
[root@docker1 ~]# sh d.sh
This /data/20200522 is already exist,Please exit.2)判断一个文件是否存在
[root@docker1 shell]# cat a.sh
#! /bin/bashFILE=/tmp/20200222.txtif [ ! -f $FILE ];thenecho "OK" >> $FILE
elsecat $FILE
fi[root@docker1 shell]# sh a.sh
[root@docker1 shell]# sh a.sh
OK3)多个条件测试判断
[root@docker1 shell]# cat b.sh
#!/bin/bashscore=$1
if [ -z $1 ];thenecho "Please input your score{80|90|100}"
exit
fiif [ $score -gt 85 ];thenecho "best"
elif [ $score -gt 75 ];thenecho "good"
elif [ $score -gt 60 ];thenecho "pass"
elseecho "no pass"
fi
[root@docker1 shell]# sh b.sh
Please input your score{80|90|100}
[root@docker1 shell]# sh b.sh 60
no pass
[root@docker1 shell]# sh b.sh 100
best

if语句实战

https://blog.csdn.net/qq_45714272/article/details/106296310
https://blog.csdn.net/qq_45714272/article/details/106299071

三、循环语句

for循环

1、打印1到15的和利用for循环
[root@a ~]# cat a.sh
#! /bin/bash
for i in `seq 15`
doecho "the number is $i"
done2、查看脚本运行过程
[root@a ~]# sh -x b.sh3、打印1到100的和
[root@a ~]# cat b.sh
#! /bin/bashj=0
for ((i=1;i<=100;i++))
doj=`expr $i + $j`
doneecho $jFor循环企业实例
1、打印当前目录所有sh结尾的文件并打包
[root@a ~]# cat c.sh
#! /bin/bashfor i in `find . -maxdepth 1  -name "*.sh"`do tar -czvf $i.tgz $i
done[root@a ~]# ls
anaconda-ks.cfg  a.sh  a.sh.tgz  b.sh  b.sh.tgz  c.sh  c.sh.tgz解压:
[root@a ~]# cat c.sh
#! /bin/bashfor i in `find . -maxdepth 1  -name "*.sh"`do tar -czvf $i.tgz $i
done[root@a ~]# sh c.sh
./a.sh
./b.sh
./c.sh[root@a ~]# cd /tmp/test/[root@a test]# ls
a.sh  b.sh  c.sh5、远程主机批量传输文件
传输单个文件
[root@a test]# cat auto_scp
#! /bin/bash
# auto scp files for client
# by 20200524 caqfor i in `echo 175.24.20.189`
do scp -r /tmp/test root@$i:/root
done[root@a test]# sh auto_scp
root@175.24.20.189's password:
a.sh                                                    100%   64     1.2KB/s   00:00
b.sh                                                    100%   76     1.4KB/s   00:00
c.sh                                                    100%   89     1.6KB/s   00:00
auto_scp                                                100%  131     2.4KB/s   00:00 传输多个文件[root@a test]# cat auto_scp
#! /bin/bash
# auto scp files for client
# by 20200524 caqFILES=$*if [ -z $* ];thenecho "input your patameter!{files|dir|...}"exit
fifor i in `echo 175.24.20.189`
do scp -r $FILES root@$i:/root/
done[root@a test]# sh auto_scp /a1 /a2
root@175.24.20.189's password:  [root@VM_0_12_centos ~]# ls
a1  a2  test免密登录
[root@a test]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:l+BheWrW/7HYGue2TlkGWTPW+bstC19H1SIOAgAmJEM root@a
The key's randomart image is:
+---[RSA 2048]----+
|*Eo....        ++|
|.+     . .    .+=|
|        * o . + +|
|       o B + . oo|
|        S + .   =|
|       o . .   * |
|            + = =|
|             @o=o|
|            o+X+ |
+----[SHA256]-----+[root@a .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@175.24.20.189
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@175.24.20.189's password: Number of key(s) added: 1Now try logging into the machine, with:   "ssh 'root@175.24.20.189'"
and check to make sure that only the key(s) you wanted were added.[root@a .ssh]# ssh 175.24.20.189
Last login: Sun May 24 21:43:32 2020 from 123.162.210.87

while循环

While循环企业实例:
IP等信息在一个文件中进行批量传输:
[root@a shell]# cat c.sh
#! /bin/bash
#by 20200524while read linedoip=`echo $line |awk '{print $2}'`echo "scp -r /tmp/text.txt root@$ip:/tmp"
done < list.txt列表信息为:
[root@a shell]# cat list.txt
1 192.168.1.1
2 192.168.1.2
3 192.168.1.3
4 192.168.1.4实现打印文件内容中的部分内容,并进行操作
[root@a shell]# sh c.sh
scp -r /tmp/text.txt root@192.168.1.1:/tmp
scp -r /tmp/text.txt root@192.168.1.2:/tmp
scp -r /tmp/text.txt root@192.168.1.3:/tmp
scp -r /tmp/text.txt root@192.168.1.4:/tmp

until循环

Until循环
这个循环语句用的较少
还是通过一个实例来理解它吧!
[root@a shell]# cat f.sh
#! /bin/bash
a=10
until [[ a -lt 0 ]]
doecho "$a"((a--))
done[root@a shell]# sh f.sh
10
9
8
7
6
5
4
3
2
1
0

四、选择语句

case语句

1、case语句简单实例
# case语句用来判断,下面这个实例打印了一个菜单列表
语法格式为:case variable inoption )cmd;;option )cmd;;... )cmd;;* )cmd;;esac
[root@a shell]# cat e.sh
#/bin/bashcase $1 inapache )echo "wait install apache server!";;mysql )echo "wait install mysql server!";;php )echo "wait install php server!";;* )echo "input your install server name please!";;
esac[root@a shell]# sh e.sh
input your install server name please!
[root@a shell]# sh e.sh mysql
wait install mysql server!2、select选择语句和case语句结合使用
select一般用于选择菜单的创建,可以配合ps3来做菜单的打印输出信息。
[root@a shell]# cat e.sh
#/bin/bashps3="select your menu:"
select i in "apache" "mysql" "php"
do
case $i inapache )echo "wait install apache server!";;mysql )echo "wait install mysql server!";;php )echo "wait install php server!";;* )echo "input your install server name please!";;esac
done[root@a shell]# sh e.sh
1) apache
2) mysql
3) php
#? 1
wait install apache server!
#? 2
wait install mysql server!
#? 3
wait install php server!

五、四剑客

grep

grep 多用作匹配
sed多用于修改
awk多用于打印特定位置字符sed命令可以实现不打开文件的情况下对文件内容进行修改
sed的替换命令格式:s/A/B/g 或者知 s#A#B#g 或者 s_A_B_g#。
s 是替代命令. s/表达式/replacement/
空白用t替代。
g(GLOBAL)
g -- 全部替代
无g -- 只替代每行第一个。修改文件内容
[root@a shell]# cat a.txt
my name is caq
abc
def预修改
[root@a shell]# sed 's/caq/kebi/g' a.txt
my name is kebi
abc
def真实修改(-i,insert)
[root@a shell]# sed -i 's/caq/kebi/g' a.txt
3对文件内容加上空格
^表示文档开头
$表示行尾
a表示下一行
i表示上一行
p代表打印
&表示添加内容,我后面有个空格就代表在文档开头加上空格,加数字,加符号都是可以的

sed

一般特殊符号要出现必须用转义字符

\' \" \* \? \\ \~ \` \! \# \$ \&  \|

如下,我想替换\t为空格
我们就可以用转义字符加在\t的前面

caq@C:~/C/code/point$ cat  malloc.c
#include <stdio.h>
#include <stdlib.h>int main()
{int *x;printf("x value: %p\t,x address: %p\t,*x value:%d\t",x,&x,*x);x = (int *)malloc(sizeof(x));printf("x value: %p\t,x address: %p\t,*x value:%d\t",x,&x,*x);*x = 10;printf("x value: %p\t,x address: %p\t,*x value:%d\t",x,&x,*x);free(x);return 0;
}预替换
caq@C:~/C/code/point$ sed "s:\\\t: :g" malloc.c
#include <stdio.h>
#include <stdlib.h>int main()
{int *x;printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);x = (int *)malloc(sizeof(x));printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);*x = 10;printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);free(x);return 0;
}加上-i参数真实替换
caq@C:~/C/code/point$ sed -i "s:\\\t: :g" malloc.c 再次查看是否替换成功
caq@C:~/C/code/point$ cat malloc.c
#include <stdio.h>
#include <stdlib.h>int main()
{int *x;printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);x = (int *)malloc(sizeof(x));printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);*x = 10;printf("x value: %p ,x address: %p ,*x value:%d ",x,&x,*x);free(x);return 0;
}
sed实例:
行首添加
[root@a shell]# sed 's/^/& /g' a.txtmy name is kebiabcdef
[root@a shell]# sed  -i 's/^/& /g' a.txt
[root@a shell]# cat a.txt my name is kebiabcdef行尾添加[root@a shell]# sed 's/$/& aaa/g' a.txtmy name is kebi aaaabc aaadef aaa[root@a shell]# sed -i  's/$/& aaa/g' a.txt
[root@a shell]# cat a.txt my name is kebi aaaabc aaadef aaa下一行添加内容先进行匹配,找到my所在行,之后在起一行[root@a shell]# sed '/my/a new line' a.txt my name is kebi aaa
new lineabc aaadef aaa上一行
[root@a shell]# sed '/my/i new line' a.txt
new linemy name is kebi aaaabc aaadef aaa打印特定一行
[root@a shell]# sed -n '/kebi/p' a.txt my name is kebi aaa打印多行
[root@a shell]# sed -n '1,3p' a.txt my name is kebi aaaabc aaadef aaa对文档进行排序和取最值
[root@a shell]# cat b.txt
#! /bin/bash
2321234123
43214214 34231
524524 4254 2425
4254543 245245
54325
[root@a shell]# cat b.txt |sed 's/ /\n/g'|sort -nr|sed -n '1p;$p'
2321234123
2425

awk

awk实例:
语法格式:
awk -option '{print $n}'
F表示分隔符打印某一列元素
[root@a shell]# cat a.txt
my name is kebi aaa
[root@a shell]# cat a.txt |awk '{print $1}'
my以:为分隔符打印第一列
[root@a shell]# cat /etc/passwd |awk -F : '{print $1}'
root
bin
daemon
...
...打印网卡IP地址
[root@a shell]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:0c:29:24:e5:c3 brd ff:ff:ff:ff:ff:ffinet 192.168.1.10/24 brd 192.168.1.255 scope global noprefixroute ens32valid_lft forever preferred_lft foreverinet6 fe80::a0b8:9a41:6d1b:7285/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@a shell]# ip a | egrep "inet"|awk '{print $2}'|sed -n '3p'
192.168.1.10/24查看根目录使用率
[root@a shell]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 475M     0  475M   0% /dev
tmpfs                    487M     0  487M   0% /dev/shm
tmpfs                    487M  7.5M  479M   2% /run
tmpfs                    487M     0  487M   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  2.2G   15G  13% /
/dev/sr0                 4.4G  4.4G     0 100% /mnt/centos
/dev/sda1               1014M  136M  878M  14% /boot
tmpfs                     98M     0   98M   0% /run/user/0
[root@a shell]# df -h|grep "/$" |awk '{print $5}'|sed s/%//g
13利用awk增加注解:
[root@a shell]# cat a.txt |awk '{print "1:" $NF}'
1:aaa

find

find案例
mtime为查找时间,-1为今天创建的文件
exec这个参数用于把find命令搜索到的结果交给紧随其后的命令做进一步处理
{}表示前面得到的结果
cmd -exec rm -rf {} \
表示把前面得到的结果删除固定格式找到某文件,并删除
[root@a shell]# find . -maxdepth 1 -type f -name "*.sh" -mtime -1
./a.sh
[root@a shell]# find . -maxdepth 1 -type f -name "*.sh" -mtime -1 -exec rm -rf {} \;
[root@a shell]# find . -maxdepth 1 -type f -name "*.sh" -mtime -1xargs同-exec都有这个功能
[root@a tmp]# find . -maxdepth 1 -type f -name "*.txt" -mtime -1 |xargs rm -rf {}  \;
[root@a tmp]# ls找到某文件并复制到指定位置
[root@a shell]# find . -maxdepth 1 -type f -name "*.txt" -mtime -1 -exec cp {} /tmp \;
[root@a shell]# cd /tmp
[root@a tmp]# ls
a.txt
b.txt
systemd-private-32cf4ca75eb6423d957b2b2a4be4d975-chronyd.service-HpBhoN
test
vmware-root_685-4013788754
vmware-root_687-4022112208
vmware-root_689-4021587913找到内存大于多少的文件并移动到指定目录
[root@a ~]# find . -maxdepth 1 -size +100M -type f
./RHEL-server-7.0-x86_64-
[root@a ~]# find . -maxdepth 1 -size +100M -type f -exec mv {} /tmp \;
[root@a ~]# cd /tmp
[root@a tmp]# ls
RHEL-server-7.0-x86_64-
systemd-private-32cf4ca75eb6423d957b2b2a4be4d975-chronyd.service-HpBhoN
test
vmware-root_685-4013788754
vmware-root_687-4022112208
vmware-root_689-4021587913

Shell脚本基础及常用的四剑客相关推荐

  1. linux 脚本编写 -eq,关于shell脚本基础编程第四篇

    shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...

  2. Shell 脚本基础学习 (四)

    现在我们来讨论编写一个脚本的一般步骤.任何优秀的脚本都应该具有帮助和输入参数.并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意.这时候,在写一 ...

  3. Linux shell脚本基础学习详细介绍(完整版)一

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  4. Linux shell脚本基础学习详细介绍(完整版)

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  5. Linux shell脚本基础学习

    Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Li ...

  6. SHELL脚本 基础一

    SHELL脚本基础 基本都是干货,都是通过书和视频总结的一小部分,里面应该有一些错误: SHELL变量 1.变量:临时储存数据的,该数据是可以进行变化的数据 2.变量的使用:1.多次重复使用的数据,并 ...

  7. linux脚本变量运算符,linux——Shell 脚本基础篇(变量类型,变量操作,定义,运算与逻辑关系)...

    Shell 脚本基础 1.变量 什么是变量 #a=1 # echo $a 1 变量:可以变化的量 1.2变量名称注意事项 变量名不能以数字开头 不能与系统中已有的环境变量重名,尽量不要全部使用大写,尽 ...

  8. Shell脚本基础 、 使用变量 、 条件测试及选择 、 列表式循环案例

    Shell脚本基础 . 使用变量 . 条件测试及选择 . 列表式循环案例 1 案例1:Shell脚本的编写及测试 1.1 问题 1.2 方案 1.3 步骤 2 案例2:重定向输出的应用 2.1 问题 ...

  9. Linux shell脚本基础学习详细介绍(完整版)2

    详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...

最新文章

  1. Asp.net的Session和Cookie传值方式
  2. 查看cananl是否启动_振动筛无法启动的3大原因及8大注意事项
  3. 期末总结:LINUX内核分析与设计期末总结
  4. ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)
  5. Go语言并发的设计模式和应用场景
  6. python linux 时间格式化,Python3 格式化日期
  7. leetcode116. 填充每个节点的下一个右侧节点指针
  8. shellcraft新姿势
  9. 面试妥了!2020 爬虫面试题目合集
  10. TOMCAT如何配置域名,可以用本地服务进行测试
  11. [SHOI2008]堵塞的交通
  12. python好友信息管理系统
  13. LMC555定时器延时测试
  14. 绕过tp路由器管理密码_无线路由器管理员密码多少 无线路由器管理员密码介绍【详解】...
  15. 新年寄语 —— 奋斗2018
  16. 一周“金”榜:CSDN创作者收益周排行榜(1月3日到1月9日)
  17. C#中,想要获得我的Windows中“我的文档”,以及桌面等,文件夹的路径。
  18. 数据库迁移 软件Spoon Kettle环境搭配(本人踩过的坑)
  19. 关于 Android O 的 treble/hidl
  20. word查找参考文献引用格式

热门文章

  1. freedownloadmanager 下载工具,代替 讯雷
  2. SSM中maven导入jar的报错问题(Line 1 in XML document from class path resource [applicationContext.xml] is ...)
  3. webassembly_全球最简单的WebAssembly简介?
  4. 勒索软件_改善市政勒索软件防御能力的3种习惯
  5. 2011级同学加分通知(只针对河软高校俱乐部2011级同学)
  6. 简单的股票行情演示(二) - AKShare
  7. 局域网不同网段ip互访
  8. python作品简单手工做法_一次性纸杯手工制作灯笼制作方法图解教程
  9. react-native:require含义
  10. 滨州学院旷考计算机二级,滨州学院学生成绩管理办法(试行)