Shell脚本语法总结

2021-10-22  本文已影响0人  rushui

一. Shell参数传递

# 获取传递参数的个数* 以单个字符串形式显示所有传入的参数
@ 与 @ 与@与*的意思一样的,输出所有传入的参数,只不过@会返回每个参数 $$ 脚本运行的当前进程ID? 获取最后退出的值,如果有return 则返回return的值,如果没有return 返回0 或 1(异常)

二.算术运算符

加法 + expr a +b
减法 - expr a -b
乘法 * expr a *b
除法 / expr a /b
求余 % expr a %b
赋值 = a=$b
相等== a = = a==a==b 返回 true 或false
不相等 != a ! = a!=a!=b 返回true 或false

三.数字关系运算符

关系运算符只支持数字,不支持字符串,除非字符串是数字。一般用于判断,返回true或false(比较的时候字符串和运算符之间有一个空格)

-eq 等于 [ a -eqb ]
-ne 不等于 [ a -neb ]
-gt 大于 [ a -gtb ]
-lt 小于 [ a -ltb ]
-ge 大于等于 [ a -geb ]
-le 小于等于 [ a -leb ]

四.字符串关系运算符

a=str1 b=str2 (比较的时候字符串和运算符之间有一个空格)

= 等于,检测字符串是否相等 [ str1 =str2 ]
!= 不等于 检验字符串不等 [ str1 !=str2 ]
-z 校验字符串长度是否为0,为0返回true, [ -z str1 ] -n 校验字符串长度是否不为0,不为0返回true, [ -nstr1 ]
校验字符串是否为空,不为空返回true [str1 ]

五.布尔运算符

!非运算,表达式为false,返回true [ ! true ]
-o 或运算,有一个表达式为true,返回true
-a 与运算,两个表达式都为true才返回false

六.逻辑运算符

&& [ a -gt 100 &&b -lt 50 ] 返回true 或false
|| [ a -gt 50 ||b -lt 10 ] 返回true或false

七.文件测试运算符

校验文件是否为指定类型,返回true或false

-b file 校验文件是否为块文件 [ -b file ] -f file 校验文件是否为普通文件,既不是设备文件也不是文件夹 [ -ffile ]
-c file 校验文件是否为设备文件 [ -f file ] -d file 校验文件是否为目录 [ -dfile ]
-g file 校验文件是否设置了SGID(Set Group ID)位, [ -g file ] -u file 校验文件是否设置了SUID(Set User ID)位, [ -ufile ]
-k file 校验文件是否粘着位 [ -k file ] -p file 校验文件是否有管道名 [ -pfile ]
-s file 校验文件是否为空 [ -s file ] -e file 校验文件是否存在 [ -sfile ]
-r file 校验文件是否有读权限 [ -r file ] -w file 校验文件是否有写权限 [ -wfile ]
-x file 校验文件是否有执行权限 [ -x file ] -L file校验文件是否为符合链接 [ -Lfile ]
-S fiel校验文件是否socket

八. 流程控制

  1. if else 结构
# if elif else fi结构 
if [ $1 -gt $2 ]; then
  echo "变量1[$1]大于变量2[$2]"
elif [ $1 -eq $2 ]; then
   echo "变量1[$1]等于变量2[$2]"
else
   echo "变量1[$1]小于变量2[$2]"
fi

2)for循环结构
写法一:

for itm in $(ls $usrPath) ; do
    if [ -s $itm ]; then
    echo "file name is $itm"
    else
    echo "file not exits"
    fi
 done

写法二:

for (( i = 0; i < 3; i++ )); do
      #$RANDOM 随意获取一个随机数
      echo $RANDOM
done
  1. case 语句
# 每个选项必须以;;结尾,*)相当于default
case $1 in
  1)
    echo "输入的值[$1]=1"
    ;;
  2)
    echo "输入的值[$1]=2"
    ;;
  3)
    echo "输入的值[$1]=3"
    ;;
  *)
    echo "default输入的值为[$1]"
  esac

4)while循环

number=$1
while [ $number -gt 5 ]; do
    if [ $number -eq 6 ]; then
            echo "number=6 continue"
            ((number--))
            continue
    fi
    echo "$number 大于5 "
    let number-=1
done

九.函数

函数的定义

function wileFunction() {
    local number=$1
    while [ $number -gt 4 ]; do
        if [ $number -eq 6 ]; then
            echo "number=6 continue"
            ((number--))
            continue
        fi
        echo "$number 大于4 "
#        let number-=1
#        ((number--))
        let  number--
    done
}

函数的调用: 函数调用直接调用函数名即可

#因为wileFunction函数需要传递一个参数$1 ,所以在调用的时候传入参数 7
wileFunction 7

十. 变量的作用域

Shell脚本变量的作用域有三种: Global (全局变量),local (局部变量) ,export (环境变量)

Global (全局变量)
Shell脚本中默认定义的变量为全局变量Global,从变量定义的位置开始,直到脚本执行完毕

local 局部变量,多用于函数内部

function wileFunction() {
    local number=$1
    while [ $number -gt 4 ]; do
        if [ $number -eq 6 ]; then
            echo "number=6 continue"
            ((number--))
            continue
        fi
        echo "$number 大于4 "
#        let number-=1
#        ((number--))
        let  number--
    done
}

export环境变量 (将自定义变量设置为环境变量),当前Shell中有效

定义形式:

export JAVA_HOME=/usr/local/java

十一. (倒引号)``与$()的区别

1.相同点:

Shell脚本中 ``和$()都可以完成内部命令的执行,如:

dateStr1=`date +"%Y-%m-%d %H:%M:%S"`
dateStr2=$(date +"%Y-%m-%d %H:%M:%S")
echo $dateStr1
echo $dateStr2
#输出结果:
2020-09-28 11:53:26
2020-09-28 11:53:26

2.不同点

$()并不是在每一种Shell中都可以执行,在bash版本肯定可以执行。但是``在所有的版本中都可以执行

$() 可以正常的执行\转移字符,转移后为一个\,``必须使用成对使用,才会起到转移的作用

十二.数组

Shell脚本中数组只支持一维数组,不支持多维数组。数组初始化的时候不需要定义数组的大小,数组元素的

下标由0开始,数组用()来表示,数组的元素之间用空格分隔。

数组的定义:

array=(tom jack lucene dock)

数组元素的获取

#1.获取指定下标的元素
echo ${array[1]}
#输出: jack
#2.获取数组中所有的元素
echo ${array[*]}  
echo ${array[@]}
#3.获取数组元素的个数
echo ${#array[*]}
#4.获取数组中元素的长度 ,tom 的len =3
echo ${#array[0]} 

数组的遍历

function arrayFunction() {
    local array=(tom tick jack link)
    # shellcheck disable=SC2068
    echo  ${array[@]}
    for item in ${array[*]} ; do
        echo "数组元素="${item}
    done

    for (( i = 0; i < ${#array[@]}; i++ )); do
        echo "第二种输出方式="${array[i]}
    done
}

数组元素的删除 通过unset删除

function arrayFunction() {
    local array=(tom tick jack link)
    # shellcheck disable=SC2068
    echo  ${array[@]}
    for item in ${array[*]} ; do
        echo "数组元素="${item}
    done

    for (( i = 0; i < ${#array[@]}; i++ )); do
        if [ $i -eq 2 ]; then
            unset array[$i]
        fi
        echo "第二种输出方式="${array[i]}
    done
    echo "删除后数组的元素="${array[*]}
}

字符串分割 数组

#只是一种方式,还有其他的分割方式
function splitStr() {
    local str="test,dateStr2,strFunction,dateStr2"
    #最后一个/后边有一个空格
    local strArray=(${str//,/ })
    echo ${strArray[*]}
    for i in ${strArray[*]} ; do
        echo $i
    done
}

十三. ( ( ) ) 和 (()) 和(())和[]

( ( ) ) 和 (())和(())和[]是一样的都是进行算数运输的。支持 + - * / %(加、减、乘、除、求余)。需要注意的是:bash脚本只能做整数运算,不能做浮点数的运算,对于浮点数当作字符串处理

function expr() {
    local var1=15
    local var2=20
    echo $((15+22))
    echo $((var1+var2))
    local sum=$((10+22))
    echo "输出的结果="$sum
    echo $[var1-var2]
    echo "减法结果="$[15-5]
}
#输出的结果为
37
35
输出的结果=32
-5
减法结果=10

十四. [[]] 和(())

(()) 是针对[] 数学表达式运算的加强版, (())不需要将表达式里面的大小写进行转义,(())除了支持标准的+ - * / %之外,还支持一下操作:

image.png

[[]] 是针对[] 对字符串表达式判断额加强版

十五.Shell脚本中调用另外一个Shell脚本

Shell脚本中调用另外一个脚本的方式有三种,分别是: fork ,exec , source三种方式。

Fork方式

Fork方式是最普通的调用方式,就是在脚本里直接调用 ,如果脚本有执行权限的话,/path/to/foo.sh 。如果没有执行权限,sh /path/to/foo.sh。

Fork方式是新开启一个子Shell,子Shell在执行的时候父Shell还在,子Shell执行完毕后返回父Shell,子Shell从父Shell中继承环境变量,但是子Shell不会将环境变量带会父Shell。

exec方式

exec 与fork不同,exec不需要开启一个子Shell来执行调用的脚本,被调用的Shell和父脚本在同一个Shell里。但是使用exec 调用一个脚本之后,父脚本中exec之后的内容就不会再执行了,这是exec和source的一个区别。

exec调用方式: exec /path/to/foo.sh

source方式

source与fork的区别不是新开一个Shell来执行调用的脚本,而是在同一个Shell中执行,所以被调用的脚本中声明的变量和环境变量,都可以在主脚本中获取和使用

source 的调用方式: . /path/to/foo.sh ,如果在当前目录: . ./foo.sh

示例:

定义一个 1.sh脚本

#!/bin/bash

tmp_var1="我是测试值1"
tmp_var2=15

echo "PID=$$" ${tmp_var1} ${tmp_var2}

定义一个test.sh脚本,并调用1.sh脚本

#!/bin/bash

function otherShell() {
  local type=$1
  case $type in
  fork)
    echo "fork 调用"
    ./1.sh
    ;;
  source)
    echo "source 调用"
    . ./1.sh
    ;;
  exec)
    echo "exec 调用"
    exec ./1.sh
    ;;
  *)
    echo "请输入调用的方式"
  esac
  echo "PID=$$" ${tmp_var1} ${tmp_var2}
}

otherShell fork
上一篇下一篇

猜你喜欢

热点阅读