1_Shell脚本入门

Shell脚本入门

 


1、Shell作用

  1. 通过Shell命令与编程语言来提高linux系统的管理工作效率

  2. 通过编写Shell命令发送给linux内核去执行, 操作就是计算机硬件. 所以Shell命令是用户操作计算机硬件的桥梁

     


2、Shell解析器

(1)Linux提供的Shell解析器有:cat /etc/shells

[root@pu8test ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/ksh
/bin/rksh

(2)Centos默认的解析器是bash:echo $SHELL

[root@pu8test ~]# echo $SHELL
/bin/bash

 


3、Shell脚本入门

(1)脚本格式:脚本以 #!/bin/bash 开头(指定解析器,默认的,可以不写)

(2)直接输出helloworld:echo "helloworld"

举例:创建一个Shell脚本,输出helloworld

[root@pu8test shell]# vi helloword.sh
#! /bin/bash
echo "helloword"
[root@pu8test shell]# sh helloword.sh
helloword
[root@pu8test shell]#

步骤:编写脚本-执行脚本

注意:

  • bash或sh 脚本的相对路径或绝对路径 ,本质是bash解析器执行脚本,所以脚本本身不需要执行权限

  • 脚本的绝对路径或相对路径(必须具有可执行权限)

./helloworld.sh
/home/helloworld.sh

知识拓展:

  • pwd 查看目录 mkdir 创建文件夹 touch 新建文件 cat 查看内容

  • 权限不够修改办法:chmod 777 helloworld.sh(最高权限)

举例:Shell脚本 在XXX目录下创建一个hobby.txt,在hobby.txt文件中增加“I love math”

[root@pu8test shell]# vim hobby.sh
#! /bin/bash
touch /tmp/shell/hobby.txt
echo "I Love math" >> hobby.txt
[root@pu8test shell]# sh hobby.sh
[root@pu8test shell]# cat hobby.txt
I Love math
[root@pu8test shell]#

 


4、Shell中的变量

  • 常用系统变量:$HOME(目录)、$PWD(目录)、$SHELL(解析器)、$USER(当前用户)等

  • 自定义变量

    • 定义变量:变量=值(等号左右不能有空格)

    • 撤销变量:unset 变量

    • 声明静态变量:readonly 变量,注意:不能unset。

    • 声明全局变量:export 变量

  • 特殊变量

    • $n:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}。

    • $#:获取所有输入参数个数,常用于循环。

    • $*:代表命令行中所有的参数,它把所有的参数看成一个整体。

    • $@:代表命令行中所有的参数,它把每个参数区分对待。

    • $?:最后一次执行的命令的返回状态。如果为0,表示上一条命令执行正确;为非0,则上一条命令执行不正确。

知识拓展:

  1. 变量名称可以由字母、数字和下划线组成,但不能以数字开头,环境变量名建议大写

  2. 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

  3. 变量的值如果有空格,需要使用双引号或单引号括起来。

举例:输出该脚本文件名称、输入参数1和输入参数2的值,获取输入参数的个数和所有输入参数的值,判断最后一条命令是否正确执行

[root@pu8test shell]# vim parameter.sh
#! /bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
echo $?
[root@pu8test shell]# sh parameter.sh one tow three
parameter.sh one tow
3
one tow three
one tow three
0
[root@pu8test shell]#

 


5、运算符

  • 基本语法:

    • $((运算式))$[运算式]

    • expr +(加)、-(减)、*(乘)、/(除)、%(取余)(expr运算符间要有空格)

举例: 计算(2+3)*4的值。(三种方法计算)

[root@pu8test shell]# expr `expr 2 + 3` \* 4
20
[root@pu8test shell]# s=$[(2+3)*4]
[root@pu8test shell]# echo $s
20
[root@pu8test shell]# s=$(((2+3)*4))
[root@pu8test shell]# echo $s
20

 


6、条件判断

  • 基本语法:[ condition ](注意 condition 前后要有空格

注意:条件非空即为true,[ pqh ]返回true,[]返回false。

  • 多条件判断:[ condition ] && echo OK || echo notok

    • &&:上一条命令执行成功时,才执行下一条命令。

    • ||:上一条命令执行失败后,才执行下一条命令。

  • 常用判断条件:

    • 两个整数之间比较:

      • =:字符串比较

      • -lt:小于(less than)

      • -le:小于等于(less equal)

      • -eq:等于(equal)

      • -gt:大于(greater than)

      • -ge:大于等于(greater equal)

      • -ne:不等于(not equal)

    • 按照文件权限进行判断:

      • -r:有读的权限(read)

      • -w:有写的权限(write)

      • -x:有执行的权限(execute)

    • 按照文件类型进行判断:

      • -f:文件存在并且是一个常规的文件(file)

      • -e:文件存在(existence)

      • -d:文件存在并是一个目录(directory)

举例:

## 23是否大于等于22
[root@pu8test shell]# [ 23 -ge 22 ]
[root@pu8test shell]# echo $?
0
[root@pu8test shell]#
## helloworld.sh是否具有写权限
[root@pu8test shell]# [ -w helloword.sh ]
[root@pu8test shell]# echo $?
0
[root@pu8test shell]#

 


7、流程控制(重点)

if判断

  • 基本语法:

    ## 基本语法
    if [ 条件判断式 ];then
        程序
    fi
    或者
    if [ 条件判断式 ]
    then
        程序
    fi
    
    ## #################################################
    ## 注意事项:
    ##        1. 中括号和条件判断式之间必须有空格。
    ##        2. if后要有空格。
    ## 案例:输入一个数字,如果是1,则输出one,如果是2,则输出two,如果是其他,则什么都不输出。
    
    #! /bin/bash
    if [ $1 = 1 ]
    then
        echo one
    elif [ $1 = 2 ]
    then
        echo two
    fi

case语句

  • 基本语法:

    ## 基本语法
    case $变量名 in
    "值1")
        程序1
        ;;
    "值2")
        程序2
        ;;
    *)
        变量都不是以上值,则执行此程序
        ;;
    esac
    
    ## #################################################
    ## 注意事项:
    ##        1. case行尾必须为单词“in”,每个模式匹配必须以“)”结束。
    ##        2. 双分号“;;”表示命令序列结束,相当于java的break。
    ##        3. 最后的“*)”表示默认模式,相当于java中的default。
    ## 案例:输入一个数字,如果是1,则输出one,如果是2,则输出two,如果是其他,则输出number。
    
    #! /bin/bash
    case $1 in
    1)
            echo one
    ;;
    2)
            echo two
    ;;
    *)
            echo number
    ;;
    esac

for循环

  • 基本语法:

    ## 基本语法
    for((初始值;循环控制;条件变量变化))
    do
        程序
    donefor 变量 in 值1 值2 值3
    do
        程序
    done
    
    ## #################################################
    ## 案例:从1加到100。
    [root@pu8test shell]# vim test_for.sh
    #! /bin/bash
    sum=0
    for(( i=1;i<=100;i++ ))
    do
            sum=$[sum+i]
    done
    
    echo $sum
    [root@pu8test shell]# sh test_for.sh
    5050
    [root@pu8test shell]#

while循环

  • 基本语法:

    ## 基本语法
    while [ 条件判断式 ]
    do
        程序
    done
    
    ## #################################################
    ## 注意事项:中括号和条件判断式之间必须有空格。
    
    ## 案例:从1加到100。
    [root@pu8test shell]# vim test_while.sh
    #! /bin/bash
    sum=0
    i=1
    while [ $i -le 100 ]
    do
            sum=$[sum+i]
            i=$[i+1]
    done
    
    echo $sum
    [root@pu8test shell]# sh test_while.sh
    5050
    [root@pu8test shell]#

     


8、read读取控制台输入

  • 基本语法:read(选项)(参数)

    • 选项

      • -p:指定读取时的提示符。

      • -t:指定读取值时等待的时间(秒)

    • 参数:变量(指定读取值的变量名)

## 案例:提示7秒内,读取控制台输入的名称
[root@pu8test shell]# vim test_read.sh
#! /bin/bash
read -t 7 -p "Enter your name:" NAME
echo $NAME
[root@pu8test shell]# sh test_read.sh
Enter your name:
[root@pu8test shell]# sh test_read.sh
Enter your name:mmdz
mmdz
[root@pu8test shell]#

 


9、函数

  • 系统函数

    • basename命令:删掉所有的前缀包括最后一个'/'字符,然后将字符串显示出来。

      • 基本语法:basename [string/pathname][suffix]

      注意事项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

    • dirname命令:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径。

      • 基本语法:dirname 文件绝对路径

    ## 案例:截取/tmp/shell/hobby.txt路径的文件名称
    [root@pu8test shell]# basename /tmp/shell/hobby.txt
    hobby.txt
    [root@pu8test shell]# basename /tmp/shell/hobby.txt .txt
    hobby
    [root@pu8test shell]#
    
    ## 案例:获取hobby.txt文件路径
    [root@pu8test shell]# dirname /tmp/shell/hobby.txt
    /tmp/shell
    [root@pu8test shell]#
  • 自定义函数:

    • 基本语法:

    ## 基本语法
    [function] funname[()]
    {
        Action;
        [return int;]
    }
    funname
    
    ## #################################################
    ## 注意事项:
    ##       1.在调用函数之前必须先声明函数,shell脚本是逐行运行,不会像其他语言一样先编译。
    ##       2.函数返回值,只能通过&?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-225)。
    
    #!/bin/bash
    function sum()
    {
        s=$[$1+$2]
        echo $s
    }
    
    read -p "Enter parameter1:" P1
    read -p "Enter parameter2:" P2
    
    sum P1 P2
    输出:
    [pqh@localhost datas]$ sh function.sh 
    Enter parameter1:2
    Enter parameter2:3
    5

     


10、Shell工具(重点)

  • cut:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

    • 基本用法:cut[选项参数] filename(默认分隔符是制表符)

    • 选项参数:

      • -f:列号,提取第几列。

      • -d:分隔符,按照指定分隔符分割列。

 

  • sed:一种流编辑器,一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,不断重复直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。

    • 基本语法:sed[选项参数] 'command' filename

    • 选项参数:

      • -e:直接在指令列模式上进行sed的动作编辑。

    • 命令功能:

      • a:新增,a的后面可以接字串,在下一行出现。

      • d:删除。

      • s:查找并替换。

 

  • awk:一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

    • 基本用法:awk[选项参数] ‘pattern1{action1} pattern2{action2}···' filename

      • pattern:表示AWk在数据中查找的内容,就是匹配模式。

      • action:在找到匹配内容时所执行的一系列命令。

      注意:只有匹配了pattern的行才会执行action。

    • 选项参数:

      • -F:指定输入文件折分隔符。

      • -v:赋值一个用户定义变量。

    • action内置变量:

      • FILENAME:文件名。

      • NR:已读的记录数。

      • NF:浏览记录的域的个数。

 

  • sort:将文件进行排序,并将排序结果标准输出。

    • 基本语法:sort(选项)(参数)

    • 选项:

      • -n:依照数值的大小排序。

      • -r:以相反的顺序排序。

      • -t:设置排序时所用的分隔字符。

      • -k:指定需要排序的列。

posted @ 2022-05-26 15:20  梅子猪  阅读(114)  评论(0编辑  收藏  举报