• shell脚本应用(一)


    Shell 脚本的概念

     将平时使用的各种Linux命令按顺序保存(堆叠)到一个文本文件中,添加上执行权限,就是一个Shell脚本。

    ● 将要执行的命令按先后顺序保存到一个文本文件

    ● 给该文件可执行权限,便可运行

    ● 可结合各种Shell控制语句以完成更复杂的操作

    Shell脚本应用场景

     ●   重复性操作

     ●   批量事务处理

     ●  自动化运维

     ●  服务运行状态监控

     ●  定时任务执行

     ●  减轻管理员负担

     ●  规避费时操作

    编写Shell脚本的格式:

    1、#!/bin/bash        表示脚本通过以/bin/bash程序来编写

    2、# 表示注释信息,例如:对编写的脚本作用进行解释,每写一段脚本之前都应该用“#”来注释以下命令执行的结果

    3、定义脚本中的变量

    4、定义脚本中的函数

    5、脚本执行语句(判断、循环、选择等语句)

    6、利用 echo 定义输出一些让人更容易看懂得信息(可以是中文也可以是英文)

    执行脚本的三种方法

    l  通过绝对路径执行:/root/first.sh或进入到脚本文件所在目录 ./first.sh (需要给脚本文件添加上执行权限)

    l  进入到脚本文件所在目录执行 sh first.sh  bash first.sh(文件可以没有执行权限)

    l  进入到脚本文件所在目录执行 source first.sh 或 .  first.sh  (文件可以没有执行权限)

    Shell的概念

           Shell是一个特殊的应用程序,介于操作系统内核和用户之间,充当一个“命令解释器”(翻译官)的角色,负责接受用户输入的指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果返回给用户。

    PS: l  linux 默认使用 /bin/bash

      l  IBM AIX(Unix) 默认使用 /bin/ksh

      l  .sh  表示编写程序为bash

      l  .pl  表示编写程序为perl

      l  .py  表示编写程序为python

    重定向和管道

    交互式硬件设备文件: standard ( input、output、error)

    l  标准输入:从该设备接收用户输入的数据

    l  标准输出:通过该设备向用户输出数据

    l  错误输出:通过该设备报告执行出错信息

    类型

    设备文件

    文件描述编号

    默认设备

    标准输入

    /dev/stdin

    0

    键盘

    标准输出

    /dev/stdout

    1

    显示器

    标准错误输出

    /dev/stderr

    2

    显示器

    重定向操作

    类型

    操作符

    用途

    重定向输入

    < 

    从指定的文件读取数据,而不是从键盘输入

    重定向输出

    > 

    将输出结果保存到指定的文件(覆盖原有内容)

    >> 

    将输出结果追加到指定的文件

    标准错误输出

    2>

    将错误信息保存到指定的文件(覆盖原有内容)

    2>>

    将错误信息追加到指定的文件中

    混合输出

    &>

    将标准输出、标准错误的内容保存到同一个文件中

    PS:重定向输入符   <   通过文件输入内容,而不是用标准的键盘输入  

          标准输出,标准输入默认省略了 0 和 1

        /dev/null 空文件 黑洞

    处理多行输出:

    [root@localhost ~]# cat << EOF > test.repo

    [c7-media]

    name=CentOS-Media

    baseurl=file:///media/cdrom

    gpgcheck=1

    enabled=1

    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    EOF

    管道符 |

    格式:cmd1  |  cmd2  [... | cmdn]

    作用:将管道前的命令输出结果作为管道后命令的参数使用

    xargs 在某些特殊情况下,管道符失去了作用,可以使用xargs命令,强制管道符后的命令使用管道符前的命令输出结果作为参数

    awk命令基础体验:

    awk -F"分隔符" '/过滤文本/{print $1}'  处理文件

    awk -F: '{ print $1 }' /etc/passwd

    Shell变量

    常量:固定的字符串,含义也是固定的。

           Shell 变量用来存放系统和用户需要使用的特定参数(值),而且参数根据用户的设定或系统环境的改变而相应的改变,灵活,适应性更强。

    变量类型:

    1、自定义变量

    自定义变量是由用户自己定义的变量,只在用户自己的Shell环境中生效,又称本地变量

    定义格式:变量名=变量值等号两边没有空格

    变量名必须使用英文字母或是下划线开头,变量名内不允许出现特殊字符,并且区分字母大小写。

    使用echo可以查看定义的变量值,$后面是一个变量名

    [root@localhost ~]# product=cloud

    [root@localhost ~]# version=2.0

    [root@localhost ~]# echo $product

    cloud

    [root@localhost ~]# echo $version

    2.0

    [root@localhost ~]# echo $product$version

    cloud2.0

    [root@localhost ~]# echo $product $version

    cloud 2.0

    [root@localhost ~]# echo $product3.0

    .0

    [root@localhost ~]# echo $product"3.0"

    cloud3.0

    [root@localhost ~]# echo "$product"3.0

    cloud3.0

    [root@localhost ~]# echo $product'3.0'

    cloud3.0

    [root@localhost ~]# echo ${product}3.0

    cloud3.0

    [root@localhost ~]# echo $product3.0

    cloud3.0

    特殊符号:

    1、双引号(“”):可以引用一个变量,有空格的值。

    [root@localhost ~]# echo "$product $version"

    cloud 2.0

    2、单引号(‘’):引号内的内容被视为一个完整的字符串,不能引用变量。

    [root@localhost ~]# echo '$product $version'

    $product $version

    3、反撇号(``):引号内的执行结果作为变量名的变量值,引用命令使用。反撇号在一行命令中不能实现嵌套命令替换操作,所以使用$()

    [root@localhost ~]# which mkdir

    /usr/bin/mkdir

    [root@localhost ~]# rpm -qf /usr/bin/mkdir

    coreutils-8.22-21.el7.x86_64

    [root@localhost ~]# rpm -qf `which mkdir`

    coreutils-8.22-21.el7.x86_64

    [root@localhost ~]# rpm -qf $(which mkdir)

    coreutils-8.22-21.el7.x86_64

    read命令:

           用来提示用户输入信息,从而实现简单的交互变量设置。将用户输入的信息作为变量值,用户的输入以空格作为分隔符,将读入的各个字段挨个赋值给指定的变量,多余的赋值给最后一个变量。

    -p  设置提示信息

    [root@localhost ~]# read -p "please input your name and age: " name age

    please input your name and age: zhangsan 20

    [root@localhost ~]# echo $name

    zhangsan

    [root@localhost ~]# echo $age

    20

    设置变量生效范围:

    新定义的变量只能在当前Shell环境中生效。又称局部变量

    export 命令:可以将局部变量发布到全局。

    [root@localhost ~]# echo $product  #查看当前shell中变量的值

    cloud

    [root@localhost ~]# bash    #切换到新的子Shell环境

    [root@localhost ~]# echo $product  #查看变量  (可以看到查不到变量值)

    [root@localhost ~]# exit                        #退出Shell环境

    exit

    [root@localhost ~]# export product           #使用export命令将变量发布到全局

    [root@localhost ~]# bash                      #进入到一个新Shell环境

    [root@localhost ~]# echo $product  #查看变量值

    cloud

    或者可以在定义变量同时声明

    [root@localhost ~]# export key=vlaue

    注意:export全局发布,只能向下面的子Shell发布,不能向上父Shell发布。

    数值变量的运算:

    使用expr命令进行简单的整数运算,不支持小数运算。

    (加)+、(减)-、(乘)*、(除)/、(取余)%

    特殊的Shell变量

    1、环境变量:

    env 命令查看环境变量

    环境变量是指,出于运行需要而由Linux系统提前创建的一类变量,主要用于设置用户的工作环境。

    l  /etc/profile : 环境变量的全局配置文件,文件中定义的变量作用于所有用户。

    l  .bash_profile :每个用户自己的独立配置文件。

    常用的环境变量:

    HOSTNAME=localhost.localdomain        #定义主机名

    PWD=/root      #定义当前所在位置

    USER=root      #定义登录用户

    set,env和export这三个命令的区别:

    env 显示用户的环境变量;

    set  显示当前shell的自定义变量,包括用户的环境变量,按变量名称排序;

    export  显示当前导出用户变量的shell变量,并显示变量的属性(是否只读),按变量名称排序;

    declare 同set 一样,显示当前shell的定义的变量,包括用户的环境变量;

    unset  取消变量

    位置变量:

    位置变量也称为位置参数,使用$1、$2、……、$9、${10}...表示

    [root@localhost ~]# vim test.sh

    #!/bin/bash

    echo "当前的位置变量是:$1"

    echo "当前的位置变量是:$2"

    echo "当前的位置变量是:$3"

    echo "当前的位置变量是:$4"

    [root@localhost ~]# ./test.sh a b c d

    当前的位置变量是:a

    当前的位置变量是:b

    当前的位置变量是:c

    当前的位置变量是:d

    预定义变量:

    预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。

             $*、$@           表示所有位置参数的内容($*把所有参数视为整体,$@单个参数的组合)

             $0                   表示当前执行的脚本或程序的名称

             $?                   表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0值为执行错误。

             $#                   表示命令行中位置参数的个数

    常用的预定义变量:

    $#         表示命令行中位置参数的个数

    [root@localhost ~]# vim test.sh

    #!/bin/bash

    echo "当前的位置变量是:$1"

    echo "当前的位置变量是:$2"

    echo "当前的位置变量是:$3"

    echo "当前的位置变量是:$4"

    echo $#

    [root@localhost ~]# ./test.sh a b c d

    当前的位置变量是:a

    当前的位置变量是:b

    当前的位置变量是:c

    当前的位置变量是:d

    4 #统计出运用了几个位置变量参数

    $*      表示所有位置参数的内容

    [root@localhost ~]# vim test.sh

    #!/bin/bash

    echo "当前的位置变量是:$1"

    echo "当前的位置变量是:$2"

    echo "当前的位置变量是:$3"

    echo "当前的位置变量是:$4"

    echo $*

    [root@localhost ~]# ./test.sh a b c d

    当前的位置变量是:a

    当前的位置变量是:b

    当前的位置变量是:c

    当前的位置变量是:d

    a b c d   #显示出位置变量的内容(值)

    $?      表示前一条命令执行后的返回状态,返回值为0表示执行正确,非0值为执行错误。

    [root@localhost ~]# cat /etc/passwd

    [root@localhost ~]# echo $?

    0             #返回的值为0,表示前面执行的命令cat /etc/passwd是正确的

    [root@localhost ~]# cat /etc/password

    [root@localhost ~]# echo $?

    1        #返回的值为1,即非0值,表示前面执行的命令cat /etc/password是错误的

    $0      表示当前执行的脚本或程序的名称

    [root@localhost ~]# vim test.sh

    #!/bin/bash

    echo "当前的位置变量是:$1"

    echo "当前的位置变量是:$2"

    echo "当前的位置变量是:$3"

    echo "当前的位置变量是:$4"

    echo $0

    [root@localhost ~]# ./test.sh a b c d

    当前的位置变量是:a

    当前的位置变量是:b

    当前的位置变量是:c

    当前的位置变量是:d

    ./test.sh         显示执行的脚本或是程序

     $@     以"参数1" "参数2" ... 形式保存所有参数

     $$     本程序的(进程ID号)PID

    date + '%F' : 全格式显示年、月、日

    date + '%T' : 全格式显示时、分、秒

    date +'%F %T' :全格式显示日期和时间

    date + '%s' : 1970-01-01到现在时间的秒数

    date + '%Y-%m-%d' %H-%M-%S' : 全格式显示日期和时间  年 月 日 时 分 秒

    date +%F -d "-1 day"

    date +%N  随机数

    echo -n = printf  输出内容不换行

  • 相关阅读:
    雅虎天气API调用
    HttpOperater
    HttpOperater-模拟HTTP操作类
    页面局部加载,适合Ajax Loading场景(Demo整理)
    FTPHelper-封装FTP的相关操作
    使用SOCKET实现TCP/IP协议的通讯
    IIS目录禁止执行权限
    Oracle10g 安装步骤
    SQL Server 2008、SQL Server 2008R2 自动备份数据库
    SQL列转行
  • 原文地址:https://www.cnblogs.com/2567xl/p/11411707.html
Copyright © 2020-2023  润新知