美文网首页
Shell 脚本基础语法和使用

Shell 脚本基础语法和使用

作者: 七维树 | 来源:发表于2021-04-07 19:21 被阅读0次

    Shell基础语法

    Shell是一种胶水语言,把多个命令组合(粘贴)在一起以实现某种功能。核心思想是'通过各种高级语言的特性(变量/判断/条件/循环等语句)计算值,用于想要执行的命令'。

    0.Shell文件及格式

    • Shell文件以.sh结尾,例如:123.sh
    • 文件头要添加'#!'告诉系统找个脚本是用什么解释器(sh/bash/zsh...)来执行,例如:#!/bin/bash , #!/bin/sh

    1.变量

    //定变量
    - bian_liang="这是变量,不能有空格"
    - Var1_="只能有字母数字下划线,不能有别的符合"
    - shuzi=782
    
    //循环赋值
    for file in `ls /etc`
    for file in $(ls etc)
    
    //使用变量
    echo $bian_liang
    echo ${bian_liang}
    - 用$美元符号使用变量,大括号{}是可选的,为了区分变量的边界,例如:
    - $bian_liangMa -> 这样无法解释出bian_liang 这个变量,需要使用:${bian_liang}Ma
    - 所以在使用变量的时候最好都加上大括号{}
    
    //变量类型
    - 局部变量: 定义在Shell脚本/命令中的变量,只能在当前shell脚本里使用
    - 环境变量: 在所有程序中都都可以使用
    - Shell变量: Shell程序设置的特殊变量,有环境变量和局部变量
    
    //数组定义
    array_name=(value0 value1 value2 value3)
    array2=(
    value0
    value1
    value2
    ....
    )
    array3[0]=value0
    array3[1]=value1
    array3[2]=value2
    
    //数组读取
    value=${array2[1]} //单个读取
    echo ${array3[@]} //全部读取
    
    //获取数组长度
    length=${#array[@]}
    length=${#array[*]}
    
    

    2.条件语句

    if [[真伪变量]] then
    
    elif
    
    else
    
    fi 
    
    //swich
    read num
    case  $num in
        1) echo '条件1'
        ;;
        2) echo '条件2'
             break
        ;;
        *) echo 'default'
        ;;
    esac
    

    3.循环语句

    for ((int i ; i <= 5; i++)):do
        echo "这是$i"
    done
    
    for in 1 2 3 4 5
    do
        content
        break
    done
    
    for in arr
    do 
        continue
    done
    
    while (( $int <= 5 ))
    do
        command
        break
    done
    
    echo "输入一个字符串"
    while read ZIFUCHUAN
    do 
        echo "ZIFUCHUN"
    done
    
    while :
    do
        command //无限循环
    done
    
    //递增
    idx=0
    idx=`expr $idx + 1`
    
    

    4.打印

    echo "输出字符串"
    echo "将输出定位到文件" > myfile
    echo -e "开启转义\n" 
    
    n > m : n输出到m
    n < m : m输入到n
    n >> m : n追加到m
    n << m : m追到到n
    n >& m : n和m合并到m
    n <& m : m和n合并到n
    n <<< m : 将右侧的字符串传递到左侧命令的标准输入
    
    //一个黑洞,抛弃输出的内容
    /dev/null
    
    printf : 格式化输出,类似于C语言
    

    5.常用命令

    `` : 反引号,把扩起来的内容执行一次,然后把结果返回
    |  : 管道,把上一个命令的输出到结果传递给下一个命令。
    read val: 从命令行读取一行,并用后面的变量来接收
    

    6.注释

    # 单行注释
    :<< EOF 
    多行注释,其中EOF可以换成别的字符,如,!...
    EOF
    

    7.参数

    - $0,$1,$2....$n  :用$符号获取参数,参数从0开始按顺序递增1
    - $# :参数个数
    - $*  :所有参数拼接成一个字符串,如 "参数1参数2参数n"
    - $$ :脚本运行的当前进程ID
    - $!  :后台运行的最后一个进程ID
    - $@:与$*相同,但是用引号把参数括起来
    - $?  :显示最后命令的状态,0表示没有错误
    - $- :显示shell使用的当前选项
    

    8.运算符

    expr  : 表示后面为一个表达式,主要必须要有空格,且用反引号` `包住,例如 : `expr 2 + 2`
    +-*/%= :加减乘除取余赋值和其他语言一样,其中*要用\反斜杠转移
    ==,!= :比较运算符要用中括号包起来[],返沪true或者false,例如:[$a == $b]
    
    //关系运算符
    -eq :等于 [$a -eq $b]
    -ne :不等 [$a -ne $b]
    -gt :大于 [$a -gt $b]
    -lt :小于 [$a -lt $b]
    -ge :大于等于 [$a -ge $b]
    -le :小于等于 [$a -le $b]
    
    ! : 非 [!true] 返回false
    -o : 或 [$a -gt $b -o $b -gt $c]
    -a : 与 [$a -le 20 -a $b -lt 30]
    
    //文件运算符
    -d file : 是否为目录文件  [-d $file]
    -e file : 文件是否存在 [-e $file]
    -f file : 是否为普通文件(非设备文件且非目录) [-f $file]
    
    //test
    test : 命令可以检查某个条件是否成立,包括数值、字符和文件
    if test $a -eq $b 
    then
        echo "="
    elif
        echo 'oo'
    else
        echo '!='
    fi
    
    

    9. 函数

    someFun() {
        echo "函数体,可以不加return,不加return 则默认返回最后一条命令执行的结果"
    }
    
    //调用
    someFun
    
    paramFun() {
        echo "$1第一个参数"
        echo "$2第一个参数"
        echo "如果参数大于等于10个,需要用$符获取参数${1}"
    }
    paramFun 1 2
    
    

    10.引入其他文件

    . 或者 source 
    source ./test1.sh
    . ./test2.sh //.要有空格
    

    11.grep搜索 -E "正则表达式要卸载括号里"

    参数 作用
    -v 逆转显示
    -i 忽略大小写
    -A 向上显示几行
    -B 向下显示几行
    -E 启用扩展
    —color 显示颜色 egrep:grep -E

    12.字符串

    • 'dan yin hao' : 单引号里面的字符串是纯字符串,变量不能使用,不能转义
    • "shang yin hao "$bian_liang" \n " : 双引号里可以用变量,也可以转义
    运算符 作用
    = 两个字符串是否相等 [a =b] 相等返回true
    -z 是否长度为0,是返回true, [-z $a]
    -n 长度是否不为0,不为0返回true, [-n $a]
    $ 是否为空,空为0,[$a]
    =~ a=~b 判断字符串a是否包含字符串b
    ${#bian_liang} 获取字符串长度
    ${bian_liang:3:4} 提取子串,输出"n_li"

    Shell脚本应用

    1.应用重签名

    2.VPN 规则

    3.PS批处理

    4.图片批量改名

    #!/bin/sh
    #批量改名
    
    DIR=$1
    PREFIX=$2
    
    pushd $DIR > /dev/null
    
    Suffixes=('.png'
    ".jpg"
    ".jpeg"
    '.PNG'
    '.JPG'
    '.JPEG')
    
    idx=0
    for name in `ls | tr " " "\?"`;
    do
    
        isImage=""
        for suffix in ${Suffixes[@]}
        do
            if [[ $name =~ $suffix ]]; then
                isImage=$suffix
            fi
            if [[ -n $isImage ]]; then 
                break 
            fi
        done
    
        if [[ -n $isImage ]]; then 
            idx=`expr $idx + 1`
            if [[ -e "image_${idx}.png" ]]; then
                echo "cant't be transform since file ${idx} exists"
            else
                mv "$name" "image_${idx}.png"
            fi
        fi
    
    done
    
    popd > /dev/null
    
    

    5. Crash符号

    相关文章

      网友评论

          本文标题:Shell 脚本基础语法和使用

          本文链接:https://www.haomeiwen.com/subject/whqycltx.html