第十二章 Shell_脚本

1.shell 脚本

1.1  格式

#!/bin/bash  #指定执行器
#author:大王 
#funDesc:脚本功能说明
#version:版本
#contact:联系方式
#history:历史记录
#环境变量的声明(与Java中的导包类似)
source /etc/profile
source ~/.bashrc

1.2 调用方式

source 脚本名称
    1.将脚本作为source命令的参数
    2.在当前线程下运行($$-pid不变)
    3.脚本可以没有执行权限
    [root@gaocun user]# source demo.sh 
    demo.sh 执行了
    当前进程id:17583
    [root@gaocun user]# echo $$
    17583

/bin/bash 脚本名称
sh 脚本名称
    1.将脚本作为sh命令的参数
    2.在当前线程的子线程运行($$-pid改变) 
    3.脚本可以没有执行权限
    [root@gaocun user]# sh demo.sh 
    demo.sh 执行了
    当前进程id:25696
    [root@gaocun user]# echo $$
    17583
    
./脚本名称
    1.必须授予脚本执行权限(x)
    2.在当前线程的子线程运行($$-pid改变)
    [root@gaocun user]# ./demo.sh
    -bash: ./demo.sh: 权限不够
    [root@gaocun user]# ll demo.sh 
    ---------- 1 root root 65 5月   8 17:57 demo.sh
    
脚本名称
    1.必须授予脚本执行权限(x)
    2.在当前线程的子线程运行($$-pid改变)
    3.脚本必须在 环境PATH路径内
    [root@gaocun user]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/software/jdk1.8/bin:/home/software/hadoop-3.1.3/bin:/home/software/hadoop-3.1.3/sbin:/home/software/hive/bin:/home/software/scala-2.13.6/bin:/home/software/spark-3.2.1-local/bin:/root/bin
    [root@gaocun user]# demo.sh 
    demo.sh 执行了
    当前进程id:6097

1.3 执行顺序 

    1.相对路径、绝对路径
    2.别名 alias
    3.环境变量 $PATH 按顺序扫目录

1.4 脚本的参数

    格式: sh arg1 arg2 arg3 脚本
    参数调用:         
        echo "当前进程id:$$"
        echo "当前脚本参数个数:$#"
        echo "当前脚本数组:$@"
        echo "当前脚本字符串:$*"
        echo "当前脚本的名称:$0"
        echo "第一个参数:$1"
        echo "第二个参数:$2"
        echo "第三个参数:$3"

1.5 脚本的返回值

    $? : 0执行成功 1执行失败

 2. 数值运算

2.1 整数运算

    方式1: var=$((运算内容))
        [root@gaocun bin]# var=$((1+1))
        [root@gaocun bin]# echo $var
        2
        [root@gaocun bin]# echo $((var++))
        2
        [root@gaocun bin]# echo $((++var))
        4
    方式2: 格式 var=$[运算内容]
        [root@gaocun bin]# var=$[1+1]
        [root@gaocun bin]# echo $var
        2
        [root@gaocun bin]# echo $[var++]
        2
        [root@gaocun bin]# echo $[var++]
        3
    方式3: 格式 let var=运算表达式
        [root@gaocun bin]# let var=1+1
        [root@gaocun bin]# echo $var
        2
        [root@gaocun bin]# let var++
        [root@gaocun bin]# echo $var
        3
        [root@gaocun bin]# let ++var
        [root@gaocun bin]# echo $var
        4
    方式4: 格式 expr 运算表达式
        [root@gaocun bin]# var=`expr 1 + 1`
        [root@gaocun bin]# echo $var
        2

2.2  浮点数运算

    格式: 
        bc -参数 -文件
        echo 运算内容 | bc -参数
    运算符号:
        + - * / ^ %
    参数:
        scale=x 保留x位小数
        ibase=y;var 输入数据进制(后)
        obase=x;var  输出数据进制(前)
        -l 使用标准数学库(使用特殊函数时需要指定) 
            例子 打印π
    示例:
        设置小数精度
            echo "scale=2;3/8" | bc
        进制转化
            2to10: echo "obase=10;ibase=2;1100100" | bc 
            10to2: echo "obase=2;ibase=10;100" | bc
        计算平方
            echo "10^10" | bc
        计算平方根
            echo "sqrt(100)" | bc
        计算π值
            echo "scale=100;4*a(1)" |bc -l 

3. if判断语句

3.1 基本语法

    格式1:
        if 逻辑表达式  ;then
             command ; 
        fi
    格式2:
        if 逻辑表达式  ;then
             command ; 
        else
              command ;
        fi
    格式3:
        if 逻辑表达式  ;then
             command ; 
        elif 逻辑表达式 ;then
             command ;
        else
              command ;
        fi
   格式4:(适用于终端命令提示符)
    
if 逻辑表达式; then command; else command;fi

3.2 逻辑表达式

    格式: test 或 []
    注意:
        [] 内的每个元件都要用空格分开
        [] 内的变量、常量最好用“var” 编码空格导致语法歧义

3.3  判断档案 test -参数 file | [ -参数 file ]

#判断档案 test -参数 file | [ -参数 file ]
参数:
    -e 是否存在
    -f 是否存在且为文件
    -d 是否存在且为目录
    -L 是否存在且为连接档
    -r 是否存在且有读权限
    -w 是否存在且有写权限
    -x 是否存在且有执行权限
    -s 是否存在且为非空档案
    
示例:
#判断文件是否存
if test -e bash.sh; then
   echo 文件存在
fi

#是否存在且为文件
if [ -f bash.sh ]; then
    echo 存在且为文件
fi

#    -d 是否存在且为目录
if [ -d ../bash ]; then
    echo 存在且是目录
fi

3.4 判断整数 test int1 -参数 int2 | [ int1 -参数 int2 ]

#判断整数 test int1 -参数 int2 | [ int1 -参数 int2 ]
参数:
    -eq 整数是否相等 ==    
    -ne 整数是否不等 !=
    -gt 大于 >
    -lt 小于 <
    -ge 大于等于 >=
    -le 小于等于 <=
    
示例:
if [ 10 -eq 10 ];then
    echo "10 = 10"
fi

if [ 11 -gt 10 ];then
    echo "11 >= 10"
fi

3.5 判断字符串 test -参数 字符串 | [ -参数 字符串 ] 

#判断字符串 test -参数 字符串 | [ -参数 字符串 ] 
参数:
    -z 是否为空
    -n 是否非空
    str1 == str2 是否相等
    str1 != str2 是否不等
    
#示例
var=""
var1="大王"
if [ -z $var ];then
    echo 字符串为空
fi

if [ -n $var1 ];then
    echo 字符串不为空
fi

3.6 逻辑运算

#逻辑运算
参数:
    -a and
    -o or
    !非
    || 或 假|| 执行
    && 与 真&&执行
注意:
    -a -o 和 || &&的区别
    -a -o 在 [ true -a false ] 内使用
    || && 在 [ true ] || [ false ] 内使用

示例:
var=""
var1="大王"
# || && 使用
if [ -z $var ] && [ -n $var1 ] ;then
    echo "字符串1为空 且 字符串2不为空"
fi

# -a -o ! 的使用
if [ 1 == 1 -a "1" == "2" ];then
    echo "字符串1为空 且 字符串2不为空"
else
    echo "hahaha"
fi

3.7 if语句的返回结果

#if语句的返回结果
    $? 0-true 1-false
示例:
    if [ 1 == 2 ];then
        echo true
    else
        echo false
    fi
    
    #查看if执行结果
    echo $?

 4. case选择语句

4.1  格式

#格式
    case 变量 in
        变量内容1)  
        command1
        command2
        command3
        ;;
        变量内容2)  
        command1
        command2
        command3
        ;; 
        *) #默认值
        command1
    esac

#注意事项
    匹配到相等内容后会自动停止

4.2 示例

echo "root@gaocun's password:"
read -p "root@gaocun's password:" var
echo $var

case $var in
    123)
    echo 执行命令1
    echo 执行命令2
    echo 执行命令3
    ;;
    345)
    echo 执行命令4
    echo 执行命令5
    echo 执行命令6
    ;;
    *)
    echo 执行了defalt
esac

5. 循环语句

5.1 while 为true时进入循环体

格式:
    while 逻辑表达式
    do
    command;
    done

示例:
    var=10
    while [ $var -gt 0 ]
    do
    echo $var
    var=$((var-1))
    done

#对话脚本 echo '按下 <CTRL-D> 退出' echo -n '输入你最喜欢的历史人物: ' while read FILM do echo "是的!$FILM 是一个好人" done

#无限循环(监控脚本) while : do echo "判断逻辑" sleep 1 #沉睡1秒 done

5.2  for.in 遍历数组

格式1:
    for var in item1 item2 item3(按空格\n\t切分为数组)
    do
    command1
    command2
    command3
    done
格式2:
for var in hadoop01 hadoop02 hadoop03;do command1;command2;command3 done;  

示例:
    for var in hadoop01 hadoop02 hadoop03
    do
    echo $var
    done
    
    for var in hadoop01 hadoop02 hadoop03;do echo $var; done  

5.3 普通for循环

格式:
    for ((i=10;i>=0;i--))
    do
    command;
    done
示例:
    for ((i=10;i>=0;i--))
    do
    echo $i
    done

5.4 遍历数组

#定义数组
arr=('飞龙' '飞虎' '飞豹' '飞彪')

#数组的使用
#根据索引获取单个元素
echo ${arr[1]}
#获取指定数组的length
echo ${#arr[*]} 或 ${#arr[@]}
#获取整个数组元素,用空白符分割 类似scala中的 arr.mkstring(" ")
echo ${arr[*]} 或 ${arr[@]}
#获取整个数组的索引
echo ${!arr[*]} 或 echo ${!arr[@]}
#获取字符串的字符个数
name="123asd"
echo ${#name}

#遍历方式1
for e in ${arr[*]}
do
    echo ${e}
done

#遍历方式2
for (( VAR = 0; VAR < ${#arr[*]}; ++VAR ));
do
    echo $VAR:${arr[$VAR]}
done

 6. Bash中的函数

6.1 函数定义

格式:
    [function] 方法名 [()] {
       command;
    }
note: 不能定义形参,即(var) ❌

6.2 函数调用之实参传递

    方法名称 arg1 arg2 arg3 

6.3 函数体内可以使用的变量(形参)

第x参数: $1 $2 $3
参数个数: $?
参数数组的字符串: $* | $@
运行当前脚本的进程id: $$
上一条命令的执行状态: $? 0-true 1-false

6.4 函数的返回值

    格式: return [0-255] => $?
    限制: 只能是 0-255 的整数

6.5 函数体内怎样获取shell脚本的参数

    方法调用时,传递脚本参数
    方法名称 $*

6.7 示例

#定义一个方法
function oneFun {
    #获取参数
    echo firstFunction
    echo 第一个参数:$1
    echo 第二个参数:$2
    echo 第三个参数:$3
    echo 参数数组的字符串:$*
    echo 参数的个数:$@
    echo 当前脚本进程id:$$
    echo 当前脚本进程id:$-
    #定义返回值
    return 255
}

# 调用方法(传递参数)
# 如果方法体内想使用脚本的参数,调用时需指定
oneFun $*

echo $?

7. Bash 的debug

格式:
    /bin/bash -参数 xx.sh
参数:
    -n(只检查不执行) 只检查语法,语法有问题会报错,语法没问题不输出信息
    -x(打印-检查-执行) 检查语法,有问题报错,没问题会打印脚本的执行过程
    -v(检查-执行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-05-08 20:03  学而不思则罔!  阅读(37)  评论(0编辑  收藏  举报