ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

1_Shell脚本入门

2022-05-26 15:35:10  阅读:198  来源: 互联网

标签:脚本 pu8test shell 入门 ## sh Shell echo root


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
        程序
    done
    或
    for 变量 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:指定需要排序的列。

标签:脚本,pu8test,shell,入门,##,sh,Shell,echo,root
来源: https://www.cnblogs.com/mmdz/p/16313602.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有