zoukankan      html  css  js  c++  java
  • 关于 Shell 脚本

    Shell 解释器

    Linux 提供的 Shell 解释器:

    图片

    bashsh 的关系:

    图片

    CentOS 默认的解析器:

    图片

    Shell 入门

    脚本格式,以 #!/bin/bash 开头,指定解析器

    图片

    图片

    第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限

    多命令处理

    /home/ 目录下创建一个 text.txt 文件,在文件增加 "I love the world!"

    图片

    图片

    Shell 变量

    系统变量

    图片

    使用 set 查看当前 Shell 中所有变量

    自定义变量

    定义变量 变量名=值

    撤销变量 unset 变量名

    声明静态变量 readonly 变量名=值 ,其不能 unset

    变量名定义规范:

    • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
    • 等号两侧不能有空格
    • 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
    • 变量的值如果有空格,需要使用双引号或单引号括起来

    图片

    可使用 export 变量名 把变量提升为全局环境变量,可供其他 Shell 程序使用

    hello.sh 文件:

    #!/bin/bash
    
    echo "Hello World!"
    
    echo $A
    

    图片

    特殊变量

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

    vim parameter.sh

    #!/bin/bash
    
    echo "$0 $1 $2 $3 $4"
    

    图片

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

    #!/bin/bash
    
    echo "$0 $1 $2 $3 $4"
    ech $#
    

    图片

    $* 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体

    $@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待

    #!/bin/bash
    
    echo "$0 $1 $2 $3 $4"
    echo $#
    echo $*
    echo $@
    

    图片

    $? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了

    图片

    运算符

    • $((运算式))$[运算式]
    • expr + , - , *, /, % 加,减,乘,除,取余

    注意:expr运算符间要有空格

    图片

    条件判断

    [ condition ] 条件非空即为 true,[ jkfx ] 返回true,[] 返回false

    注意:condition 前后要有空格

    两个整数之间比较

    = 字符串比较

    -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)

    图片

    流程控制

    if 判断

    if [ 条件判断式 ];then
    	语句
    fi
    
    if [ 条件判断式 ]
    then
    	语句
    fi
    

    注意事项:

    • [ 条件判断式 ] 中括号和条件判断式之间必须有空格
    • if 后要有空格
    #!/bin/bash
    
    if [ $1 -eq 1 ];then
            echo "Geek Fx is handsome!"
    elif [ $1 -eq 2 ]
    then
            echo "Jkfx is gorgeous!"
    fi
    
    

    图片

    case 语句

    case word in
    	pattern1 )
    		语句1
    		;;
    	pattern2 )
    		语句2
    		;;
    	* )
    		default语句
    		;;
    esac
    

    注意事项:

    • case 行尾必须为单词 in 每一个模式匹配必须以右括号 结束。
    • 双分号 ;; 表示命令序列结束,相当于 break。
    • 最后的 *) 表示默认模式,相当于 default。
    #!/bin/bash
    
    case $1 in
    	1 )
    		echo "Male"
    	;;
    	2 )
    		echo "Fmale"
    	;;
    	* )
    		echo "Shemale"
    	;;
    esac
    
    

    图片

    for 循环

    for (( i = 0; i < 10; i++ )); do
    	#statements
    done
    #或者
    for (( i = 0; i < 10; i++ ))
    do
    	#statements
    done
    
    #!/bin/bash
    
    s=0
    for (( i = 0; i <= 100; i++)); do
            s=$[$s+$i]
    done
    echo $s
    

    图片

    for i in words; do
    	#statements
    done
    #或
    for i in words
    do
    	#statement
    done
    

    比较 $*$@ 区别:

    • $*$@ 都表示传递给函数或脚本的所有参数,不被双引号 "" 包含时,都以 $1 $2 … $n 的形式输出所有参数。
    • 当它们被双引号 "" 包含时,$* 会将所有的参数作为一个整体,以 "$1 $2 … $n" 的形式输出所有参数;$@ 会将各个参数分开,以 "$1" "$2" … "$n" 的形式输出所有参数。
    #!/bin/bash
    
    for i in $@; do
            echo "I love $i"
    done
    
    for j in $*
    do
            echo "I like $j"
    done
    

    图片

    #!/bin/bash
    
    for i in "$@"; do
            echo "I love $i"
    done
    
    for j in "$*"
    do
            echo "I like $j"
    done
    

    图片

    while 语句

    while [[ condition ]]; do
    	#statements
    done
    #或
    while [[ condition ]]
    do
    	#statements
    done
    
    #!/bin/bash
    
    i=1
    s=0
    while [[ $i -le 100 ]]; do
            s=$[$s + $i]
            i=$[$i + 1]
    done
    echo $s
    

    图片

    read 读取控制台输入

    使用 read [-选项] 参数 从控制台读取输入内容

    选项:

    • -p 指定读取值时的提示符
    • -t 指定读取值时等待的时间(秒)
    #!/bin/bash
    
    read -t 8 -p "Enter your name in 8 seconds: " NAME
    echo $NAME
    

    图片

    函数

    系统函数

    basename 的基本用法

    basename [string/pathname] [suffix] 此命令会删掉所有的前缀包括最后一个 / 字符,然后将字符串显示出来

    [suffix] 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉

    图片

    dirname 的基本用法

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

    图片

    自定义函数

    function funname[()]
    {
    	#statement;
    	[return int;]
    }
    

    注意事项:

    • 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译。
    • 函数返回值,只能通过 $? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
    #!/bin/bash
    
    function sum()
    {
            s=0
            s=$[$1 + $2]
            echo $s
    }
    
    read -p "Input parameter1: " P1
    read -p "Input parameter2: " P2
    
    sum $P1 $P2
    

    图片

    Shell 工具

    cut

    cut 的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

    cut [选项] filename

    选项说明:

    • -f 列号,提取第几列
    • -d 分隔符,按照指定分隔符分割列,默认是

    图片

    图片

    图片

    sed

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

    sed [选项] 'command' filename

    选项说明:

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

    command 功能描述:

    • a 新增,a 的后面可以接字符串,在下一行出现
    • d 删除
    • s 查找并替换

    图片

    awk

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

    awk [选项] 'pattern1 {action1} pattern2 {action2} ...' filename

    选项参数说明:

    • pattern 表示 AWK 在数据中查找的内容,就是匹配模式(正则表达式)
    • action 在找到匹配的内容时所执行的一系列命令
    • -F 指定输入文件分隔符
    • -v 赋值一个用户定义变量

    图片

    图片

    图片

    awk 的内置变量

    • FILENAME 文件名
    • NR 已读记录数(行号)
    • NF 浏览记录的域的个数(列个数)

    图片

    图片

    图片

    sort

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

    sort [选项] [参数]

    选项说明:

    • -n 按照数值大小进行排序
    • -r 按照相反顺序排序
    • -t 设置排序时所用的分隔符
    • -k 指定需要排序的列

    图片

    不一定每天 code well 但要每天 live well
  • 相关阅读:
    九、linux-msyql下的mysql主从复制深度实战
    八、linux-mysql的mysql主从复制原理和实战
    七、linux-mysql下mysql增量备份与恢复
    六、linux-mysql的mysql字符集问题
    入坑django2
    python根据已有数据库生成model.py
    docker 常用命令记录
    gitlab自带的Nginx与原Nginx冲突的解决方案
    linux下PHP安装redis扩展
    jenkins自动部署代码到多台服务器
  • 原文地址:https://www.cnblogs.com/geekfx/p/13762581.html
Copyright © 2011-2022 走看看