一shell介绍

1.用途:使用简单,是Shell命令的集合

优点:运行节省时间,可实现批量管理,自动化,批量处理减少出错概念率。
2.shell概述:

shell:命令解释器,也是一个程序
种类:sh,bash,ksh,csh…(大多数的l=Linux发行版为 bash)

3.bash的特性:
a 历史记录----> 用户行为升级
b 别名 --------->企业垃圾桶(rm --> mv)
c 补全 ----------->命令 ($PATH), 目录
d 支持通配符—> , [ ] , [^]
e 前后台作业 —> jobs ,& ,bg ,fg
f 运行脚本:系统Shell类型cat /etc/shells(默认 shell echo $SHELL)

4.bash安全性:

输入env x=’(){:;}; echo be careful ’ bash -c “echo this is a test”
this is a test 则不需要升级系统
如果返回
be careful
this is a test 则需要升级系统
[root@localhost ~]# yum -y update bash
[root@localhost ~]# rpm -qa bash

5.shell的建立:

a:登录(交互)式shell和非登录(交互)式shell
**登录式shell:环境变量文件加载顺序/etc/profile(/etc/profile.d/),/.bash_profile,/.bashrc,/etc/bashrc
登录式shell场景:输入用户名和密码,“su - test002”定时计划任务,ansible的playbook。

b shell执行:加载环境变量ENV,该变量制定了环境文件(/etc/profile(/etc/profile.d/*),/.bash_profile,/.bashrc,/etc/bashrc) —》执行内容
6.shell的执行

a 通过sh或者bash命令执行
[root@bogon test]# bash useradd.sh
[root@bogon test]# sh useradd.sh

b 直接运行,脚本必须要有可执行权限
[root@bogon test]# /root/test/useradd.sh

c 通过. 或者source 执行,在文件中的变量,函数的返回值将会加载到父及bash环境中。
[root@bogon test]# . useradd.sh
[root@bogon test]# source useradd.sh
在脚本中定义的变量时局变量,
在命令行可以echo $hanhan 的是全变量,

d 通过重定向,说明bash和sh是可以接受标准输入的。
[root@bogon test]# bash < test.sh
[root@bogon test]# sh < test.sh

7.Shell脚本的注释
单行注释:#
多行注释::<<BLOCK
BLOCK

8.shell脚本规范
(1)开头指定脚本解释器
#!/bin/sh或#!/bin/bash
其他行#表示注释
名称见名知义 backup_mysql.sh,以sh结尾
(2)开头加版本版权等信息
#Date:创建日期
#Author:作者
#Mail:联系方式
#Function:功能
#Version:版本
(3)脚本中尽量不用中文注释
别吝啬添加注释,必要的注释方便自己别人理解脚本逻辑和功能;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰;
单行注释,可以放在代码行的尾部或代码行的上部;
多行注释,用于注解复杂的功能说明,可以放在程序体中,也可以放在代码块的开始部分
代码修改时,对修改的内容
(4)多使用内部命令
内部命令可以在性能方面为你节省很多。
type 命令。
(5)没有必要使用cat命令,尽量少使用管道。
eg:cat /etc/passwd | grep guru
使用以下方式即可
eg:grep guru etc/passwd
(6)代码缩进
(7)仔细阅读出错信息
有时候我们修改了某个错误并再次运行后,系统依旧会报错。然后我们再次修改,但系统再次报错。这可能会持续很长时间。
但实际上,旧的错误可能已经被纠正,只是由于出现了其它一些新错误才导致系统再次报错
(8)脚本以.sh为扩展名
eg:script-name.sh

二shell变量

1.查看:env: 系统的全局变量
set: 所有的全局变量
declare: 所有导入的全局变量和函数

定义全局变量
[root@bogon test]# export a=“123”
[root@bogon test]# b=456
[root@bogon test]# export b

局部变量的定义
’ ’ : 强引
" " :弱引
: 执行Shell命令

永久生效
/etc/profile(/etc/profile.d/*),/.bash_profile,/.bashrc,/etc/bashrc

2.shell中常见的固定性的内容的生成
加密码:

          Centos 6:grub-md5-crypCentos 7:grub2-mkpasswd-pbkdf2 grub-md5-crypt >> /etc/grub.confgrub-md5-crypt |tee -a /etc/grub.conf

md5文件校验码:
[root@bogon test]# md5sum passwd1
56cf56372303c1c769ec0d030144e60c passwd1
[root@bogon test]# md5sum passwd
911bc5a50ff7cb7e2de6addb28c94abe passwd
(1)生成自然数:
方法一:
[root@bogon test]# echo {001…100}
[root@bogon test]# echo {1…100}

实例:
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-19 18:26:33
#Name:num.sh
#Version:V1.0
#Description:This is a test script.
read -p “请输入起始值:” sta
read -p “请输入终止值:” sto

for i in eval echo {$sta..$sto}
do
echo $i
done
总结:bash不会解析多层变量,eval命令能解析多层变量。
[root@bogon test]# set 11 22 33 44
[root@bogon test]# echo $4
44
[root@bogon test]# echo $# #打印参数的个数
4
[root@bogon test]# echo $$#
$4
[root@bogon test]# eval echo $$#
44

方法二:
seq命令用于产生从某个数到另外一个数之间的所有整数。
seq [选项]… 尾数
seq [选项]… 首数 尾数
seq [选项]… 首数 增量 尾数
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
[root@localhost ~]# seq -f “%3g” 8 12

[root@localhost ~]# seq -f “%03g” 8 12

[root@localhost ~]# seq -w 8 12

[root@localhost ~]# seq -s" " -f"str%02g" 9 11

[root@localhost ~]# seq -s"echo -e "\t"" 9 11

[root@localhost ~]# seq -s"echo -e "\n"" 9 11

[root@localhost ~]# seq -s"=" 9 11

(2)随机数生成:
方法一: $RANDOM

[root@bogon test]# cat random.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 09:11:09
#Name:random.sh
#Version:V1.0
#Description:This is a test script.

function rand(){
min=KaTeX parse error: Expected 'EOF', got '#' at position 4: 1 #̲400000 max…(( 2 − 2- 2−min+1)) #500000-400000+1 100001
num= ( ( (( ((RANDOM+1000000000)) #增加一个10位的数再求余 #4012 +10000000000 = 1000004012
echo ( ( (( ((num% m a x + max+ max+min)) # 1000004012%100001 +400000 < 100001 +400000 < 500000;
}

read -p “please input your num of start:” sta
read -p “please input your num of end:” sto

rnd=$(rand $sta $sto)
echo $rnd
exit 0

方法二:openssl
[root@bogon test]# openssl rand -base64 8 |md5sum |cut -c 1-12
[root@bogon test]# openssl rand -base64 8 |cksum |cut -c 1-10 #最大十位

生成UUID:
[root@bogon test]# uuidgen
[root@bogon test]# cat /proc/sys/kernel/random/uuid

生成MAC:
[root@bogon test]# echo “00:0c:29:openssl rand -hex 3 | sed 's/\(..\)/\1:/g; s/.$//'

(3)命令排序
; 拼接多个命令没有逻辑关系
[root@bogon test]# ll 123;sh useradd.sh
&& 拼接多个命令,有逻辑关系
[root@bogon test]# sh useradd.sh && ll 123
[root@bogon test]# ll 123 && sh useradd.sh
|| 拼接命令,有逻辑关系,
[root@bogon test]# ll 123 || sh useradd.sh
注意:
command & 后台执行
command &>/dev/null 混合重定向(标准输出1,错误输出2)
command1 && command2 命令排序,逻辑判断

(4)通配符及转移


  • [] :
    [^] :

{} 集合
[root@bogon boot]# mkdir /home/{111,222}
[root@bogon boot]# mkdir -pv /home/{333/{aaa,bbb},444}
[root@bogon boot]# cp -vp /etc/sysconfig/network-scripts/ifcfg-ens32 /etc/sysconfig/network-scripts/ifcfg-ens32.bak
“/etc/sysconfig/network-scripts/ifcfg-ens32” -> “/etc/sysconfig/network-scripts/ifcfg-ens32.bak”
[root@bogon boot]# cp -vp /etc/sysconfig/network-scripts/{ifcfg-ens32,ifcfg-ens32.bak1}
“/etc/sysconfig/network-scripts/ifcfg-ens32” -> “/etc/sysconfig/network-scripts/ifcfg-ens32.bak1”
[root@bogon boot]# cp -vp /etc/sysconfig/network-scripts/ifcfg-ens32{,.bak2}
“/etc/sysconfig/network-scripts/ifcfg-ens32” -> “/etc/sysconfig/network-scripts/ifcfg-ens32.bak2”

[root@bogon ~]# echo -e “a\tb”
a b
[root@bogon ~]# echo -e “a\tb”
a b
[root@bogon ~]# echo -e “a\nb”
a
b
[root@bogon ~]# echo -e “anb”
anb
[root@bogon ~]# echo -e ‘a\nb’
a
b
[root@bogon ~]# echo -e “a\nb”
a
b

(5) 位置变量
$0,
$1,$2 … 9 , 9, 9,{10},${11} … # 接收脚本或者函数的位置参数。
$0 文件名,若执行脚本时带有路径,会将路径和将本名同事输出。
$# 表示参数的个数
实例:
[root@bogon test]# cat random.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 09:11:09
#Name:random.sh
#Version:V1.0
#Description:This is a test script.

function rand(){
min=KaTeX parse error: Expected 'EOF', got '#' at position 4: 1 #̲400000 max…(( 2 − 2- 2−min+1)) #500000-400000+1 100001
num= ( ( (( ((RANDOM+1000000000)) #增加一个10位的数再求余 #4012 +10000000000 = 1000004012
echo ( ( (( ((num% m a x + max+ max+min)) # 1000004012%100001 +400000 < 100001 +400000 < 500000;
}

#read -p “please input your num of start:” sta
#read -p “please input your num of end:” sto

#rnd=$(rand $1 $2)
if [ KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ -eq 2 ] …# :用户传递的参数个数
then
rnd=$(rand $1 $2) # $1 $2 :用户传递的位置参数
echo $rnd
exit 0

else
echo “parameter is not anough,[ $0 parameter1 parameter2]” #$0 :脚本名
fi

        $*                   获取当前Shell脚本所有传参的参数,不加引号和$@相同;如果给$*加上双引号,例如:"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3"$@                 获取当前Shell脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,例如:"$@",则表示将所有参数视为不同的独立字符串,相当于"$1" "$2" " $3" "..."。当"$@"和"$*"都加双引号时,两者是有区别的;都不加双引号时,两者无区别。

# ∗ , *, ∗,@ 获取所有参数。
:<<BLOCK
n=0
for i in "KaTeX parse error: Expected 'EOF', got '#' at position 6: *" #̲"" 表示把所有参数当成一个整体,$ 表示所有参数是独立的个体。
do
echo $i
let n++
done
echo $n #统计循环次数
#echo $*
BLOCK

n=0
for i in “KaTeX parse error: Expected 'EOF', got '#' at position 5: @" #̲ "@”,$@ 表示所有参数是独立的个体。
do
echo $i
let n++
done
echo $n

(6)dirname,basename
[root@bogon test]# dirname /root/test/var2.sh
/root/test
[root@bogon test]# basename /root/test/var2.sh
var2.sh

实例:
[root@bogon test]# cat var2.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 11:23:32
#Name:var2.sh
#Version:V1.0
#Description:This is a test script.
echo $0
echo “dirname $0” #dirname 打印路径
echo “basename $0” #basename 打印文件名

(7)状态变量
$? :(1)判断上一条命令是否执行成功,成功则返回0,不成功则返回非0;
(2)获取脚本的exit的退出码
(3)获取的是函数的返回值

实例:监控web服务状态是否正常
思路:a 判断进程:[root@bogon test]# ps -ef |grep httpd
[root@bogon test]# killall -0 httpd
b 判断端口:[root@bogon test]# netstat -tunalp |grep 80
c 判断链接:[root@bogon test]# curl 127.0.0.1

实例
[root@bogon test]# cat monitor_httpd.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 11:45:41
#Name:monitor_httpd.sh
#Version:V1.0
#Description:This is a test script.

service=httpd

while true
do
killall -0 $service &>/dev/null
#curl 127.0.0.1 &>/dev/null
#ps -ef |grep httpd |grep -v grep &>/dev/null
#netstat -tulanp |grep 80 &>/dev/null
if [ $? -eq 0 ]
then
echo “httpd is up …”
else
echo “httpd is down …”
fi
sleep 1
done

实例:
[root@bogon test]# cat state1.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 14:56:47
#Name:state1.sh
#Version:V1.0
#Description:This is a test script.

testfun(){
#i=$1
if (($1<200))
then
echo “$1”
#exit 1
return 1
fi
}

testfun $1
#echo $?
if [ ? − e q 1 ] t h e n e c h o " 输 对 了 。 。 。 " e l s e e c h o " 输 错 了 。 。 。 " f i ( 8 ) ? -eq 1 ] then echo "输对了。。。" else echo "输错了。。。" fi (8) ?−eq1]thenecho"输对了。。。"elseecho"输错了。。。"fi(8)$: 获取当前脚本的进程号
实例:
[root@bogon test]# cat test_ping.sh
#!/bin/bash
#Author:Anliu
#Blog: https://i.cnblogs.com/posts?cateId=1583983
#Time:2020-06-20 15:49:20
#Name:test_ping.sh
#Version:V1.0
#Description:This is test script.
if [ -f /tmp/pid.ping ]
then
kill cat /tmp/pid.ping
echo > / t m p / p i d . p i n g e l s e e c h o >/tmp/pid.ping else echo >/tmp/pid.pingelseecho >/tmp/pid.ping
fi

while true
do
for i in cat IP.txt
do
#echo $i
sleep 5
ping -c 1 $i &>/dev/null
if [ ? − e q 0 ] t h e n e c h o " ? -eq 0 ] then echo " ?−eq0]thenecho"i tong …" >> ping.log
else
echo “$i not tong …” >> ping.log
fi
done
#sleep 5
#echo $$ > /tmp/pid.ping
done
#rm -rf /tmp/pid.ping

$! :获取上一个在后台运行的进程PID
$_ :获取上一个命令的最后一个参数

shell脚本基础介绍与特使变量相关推荐

  1. Shell脚本基础介绍

    shell基础简介: 编写脚本通常使用某种基于解释器的编程语言.而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本. 进入Linux系统(Ubun ...

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

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

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

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

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

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

  5. 详细介绍Linux shell脚本基础学习(一)

    2019独角兽企业重金招聘Python工程师标准>>> Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础 ...

  6. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

  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脚本基础学习

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

最新文章

  1. 杭州网络推广带大家了解404页面的作用以及对网站优化的优势
  2. 计算机网络 | 网络基础 :网络协议,协议分层,数据封装与分用,地址管理,字节序
  3. javaweb---简易邮件发送
  4. [ExtJS6]ResponsiveColumn-自适应列布局
  5. 单例模式的两种实现方法:饿汉式和懒汉式以及民间懒汉式和登记式
  6. 会员制营销与EMAIL营销
  7. CRC冗余校验的真正原理之模2除法
  8. 高德地图纠偏 php,驾车轨迹纠偏-轨迹纠偏-示例中心-JS API 示例 | 高德地图API
  9. 音频处理——音频编码原理简介
  10. Elasticsearch相关操作梳理
  11. js - 数学运算(取整,取余)
  12. houdini 求出曲线的法向 切线以及副法线
  13. Hive学习使用一周感悟
  14. HDOJ 1846 Brave Game(巴士博弈)
  15. mLife | 朱永官院士提出生态系统微生物组学
  16. 发布你自己的轮子 - PyPI打包上传实践
  17. [淘宝客技术篇006]如何登录阿里妈妈-《登录淘宝网·二维码实现法》(下)
  18. 第四章 进程同步与互斥
  19. vue表单验证,中文验证
  20. corners边框_Js实现的6种圆角边框样式

热门文章

  1. 在西雅图工作一年,口袋还剩多少钱?
  2. SEO到底是什么意思?作用是什么?
  3. 浙江省高中信息技术python_浙江省新高中信息技术教材,将围绕Python进行并增加编程相关知识点...
  4. pandas使用strftime函数将dataframe的日期格式数据列按照指定格式(format)转化为日期(时间)字符串数据列
  5. 商业价值深度报道 iPad降临昭示苹果的未来
  6. java导出word,红色的单元格背景色显示为黑色
  7. Photoshop脚本 使用去色功能
  8. @NotEmpty、@NotBlank、@NotNull 区别和使用
  9. EXCEL----数据处理(一)----找出两列数据(单列无重复)中的重复项并知道不重复部分的来源
  10. android模拟器玩手游,在电脑上玩游戏使用哪个安卓模拟器比较好?