Shell原创

原创
小哥 3年前 (2022-10-22) 阅读数 52 #大杂烩

Shell

一、Shell概述

1.1 定义

Shell是接收应用程序的命令行解释器。/用户命令,然后调用操作系统内核;
Shell它也是一种功能强大的编程语言,易于编写、易于调试和灵活。

1.2 Centos的解析器

1.3 bash和sh的关系

二、Shell脚本入门

2.1 脚本格式

脚本以 #!/bin/sh 或者:#!/bin/bash 开始(指定解析器)

2.2 第一个Shell脚本:Hello World

要求:创建Shell脚本,输出 Hello World

2.3 执行脚本的常见方式

第一条:领养bash或sh+脚本的相对或绝对路径(不提供脚本+x权限)

第二:使用输入脚本的绝对或相对路径执行脚本(必须具有可执行权限)+x)
(a) 首先要给予的是 helloworld.sh 脚本的执行权限(+x)
(b) 执行脚本:相对路径/绝对路径

注:第一种执行方法,本质上bash解析器帮助我们执行脚本,因此脚本本身不需要执行权限;
第二种执行方法本质上是脚本需要自己执行,所以它需要有执行权限。

三、变量

3.1 自定义变量

( a ) 定义变量:变量=值
( b ) 吊销变量:unset 变量
( c ) 声明静态变量:readonly 变量(注意:不能unset)

(d) 注:等号两侧不能有空格
(e) 如果变量的值包含空格,则需要用双引号或单引号将其引起来。
(f) 变量的默认类型为字符串类型,不能直接使用数值运算执行。

3.2 特殊变量

$n

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

$

$# (功能描述:获取所有输入参数个数,常用于循环)

$* & $@

$
(功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数, (功能描述:这个变量代表命令行中所有的参数,
将所有参数作为一个整体来考虑)

$@
(功能描述:这个变量也代表命令行中所有的参数,不过 (功能描述:这个变量也代表命令行中所有的参数,不过 (功能描述:这个变量也代表命令行中所有的参数,不过 @以不同的方式对待每个参数)

补充:

$@ 表示参数的数组类型,当有多个参数时,每个参数占用一个数组元素;

$* 表示参数的字符串类型,当有多个参数时,所有参数都组合成一个长字符串作为参数。


小结:

$$@和
$当没有双引号时,实际上是一样的。然而,当使用双引号时,情况就不同了。
$@假设它是一个数组,则该数组为空,即没有元素。
$
假设它是一个字符串,当字符串为空时,表为空,但不为空,因此在遍历时,有一个元素

$?

$?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明前一条命令执行正确;0(具体数字由命令本身决定),证明上一条命令执行不正确)

4.有条件的判决

4.1 基本语法

(a) test condition

(b) [ condition ] (注意:condition前后应留有空格)

补充:条件不为空。true:[ binbin ] 返回true;[ ] 返回false

4.2 共同判断条件

4.2.1 两个整数之间的比较

4.2.2 根据文件权限进行判断

4.2.3 按文件类型判断

5.过程控制

5.1 if判断

案例:如果是,请输入一个数字。1,然后输出:one excellent person;如果是2,则:two excellent person;否则,more excellent person

if [ $1 -eq "1" ]
then
        echo "one excellent person"
elif [ $1 -eq "2" ]
then
        echo "two excellent person"
else
        echo "more excellent person"
fi

备注:(a) [ 有条件判决 ],中括号和有条件判决必须有空格;(b) if 后面应该有一个空格。



5.2 case语句

案例:如果是,请输入一个数字。1,然后输出:one case statement;如果是2,则:two case statement;否则,more case statement

case $2 in
"1")
        echo "one case statement"
;;
"2")
        echo "two case statement"
;;
*)
        echo "more case statement"
;;
esac

备注:

( a ) case行尾必须是“”一词in,每个模式匹配必须在右括号中)”结束

( b ) 双分号“;;“表示命令的末尾,它等同于Java中的break

( c ) 最后的“*)“表示默认模式,它等同于Java中的default

5.3 for循环

5.3.1 语法一

for (( 初始值;循环控制条件;变量变化 ))

do

xxx

done

需求:从1加到100

注:操作员:“ ( ( 运算式 ) ) ”或“ ((运算式))”或“ (( 运算式 )) ” 或 “ [ 运算式 ]”

e.g:计算 (2+3) * 4的值

echo "***************for 循环***********"
s=0
for((i=0;i<=100;i++))
do
        s=$[ $s+$i ]
done
echo "从1加到100的和:"$s

5.3.2 语法二

for 变量 in 值1 值2 值3…

do

xxx

done

示例:打印所有输入参数

for i in $*
        do
                echo $i" person:Urbane Binbin"
        done

5.3.3 $*和 $@的区别

$* 和 $@当传递给函数或脚本的所有参数没有包括在双引号“”中时,将使用这些参数。$1 2 … 2 … 2 … n输出表单中的所有参数。
实例:

echo "*************for 循环二***********"
for i in $*
        do
                echo $i" person:Urbane Binbin"
        done
echo "***********不包含在双引号中*********"
for j in $@
        do
                echo $j" person:Urbane Binbin"
        done


当它们包含在双引号中时,$*会将所有参数作为一个整体$1 $2 …
$n以的形式输出所有参数;“ $@ “将参数分隔为” $1 ” “ $2 ”…” $n“输出表单中的所有参数”

echo "***********包括在双引号中***********"
for i in "$*"
# $*中的所有参数for循环将只执行一次。
        do
                echo $i" person:Urbane Binbin"
        done

for j in "$@"
# $@中的每个参数都被视为独立的,因此“$@有几个参数,它会循环几次。
        do
                echo $j" perosn:Urbane Binbin"
        done

六、函数

6.1 系统函数

6.1.1 basename

basename [string / pathname] [suffix] (功能描述:basename该命令删除所有前缀,包括最后一个(‘/‘)字符,然后显示该字符串。

选项:suffix是后缀ifsuffix被指定为,basename会将pathname或string中的suffix去掉

6.1.2 dirname

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

6.2 自定义函数

[ function ] funname[()]
{
Action;
[return int;]
}
funname

示例:计算两个输入参数的和。

echo "***********自定义函数***********"
function sum()
{
        s=0
        s=$[ $1 + $2 ]
        echo "$s"
}
read -p "请输入自定义函数sum()第一个参数:" n1;
read -p "请输入自定义函数sum()第二个参数:" n2;
# 调用
sum $n1 $n2;



注意:必须在调用函数之前声明函数,shell脚本是逐行运行的。它不会像其他语言那样首先编译。

七、read读取控制台输入

read(选项)(参数)

选项:

-p:指定读取值时的提示;

-t:指定读取值时等待的时间(秒)

参数:变量:指定读取值的变量的名称。

echo "********read读取控制台输入********"
read -t 7 -p "请在7以秒为单位输入您的姓名:" NAME
echo $NAME


超过7秒,自动跳出

8.学以致用

function showhelp()
{
        echo "###################################!!! you must input at least two params !!!#####################################################################"
        echo "#Usage: [sh basename $0 kill_by_runtime|-t minutes] show info with filenames ascending order ,eg: sh basename $0 kill_by_runtime 180"
        echo "#Usage: [sh basename $0 kill_by_vcores|-v cores_nums] show info with sizes ascending order,eg: sh basename $0 kill_by_vcores 30"
        echo "##################################################################################################################################################"
}

#首先,确定输入参数的数量是否符合要求。
if [ $# -ne 2 ]; then
        #如果传入的参数数量不相等2,则会记录并退出错误。
        showhelp
        #退出
        exit 1
fi

# 当前时间
see_current_time=date +%Y-%m-%d %H:%M:%S
# 当前时间戳
current_time_temp=date +%s%N
current_time=$[$current_time_temp/1000000]
# 指定日志的输出部分。outfile
outfile=./moniter_on_yarn.log

echo "======== running results: =========" >> $outfile
echo "======== current_time: ============="$see_current_time >> $outfile
echo "======== current_timestamp: ========"$current_time >> $outfile

function origin()
{
      sudo kinit -kt /etc/security/keytabs/hdfs.keytab hdfs
      # 获取正在运行的任务。
      app_list=sudo yarn application -list | grep -w RUNNING | awk {print $1} | grep application_
      for app in ${app_list[@]}
      do
        echo "======== active application: ========"${app} >> $outfile
        # 获取:Application Report
        app_status=sudo yarn application -status ${app}

        # 获取:Application Start-Time
        start_time=$( expr "$app_status" : .*([0-9]{13}).* )
        echo "======== application start time: ========"$start_time >> $outfile

        # 任务的开始时间与当前时间不同。
        ((diff_time=$current_time-$start_time))
        echo "======== application have run time: ========"$diff_time >> $outfile
         echo "======== limit value application have run time: ========"$1 >> $outfile

        if [ $diff_time -gt $1 ]
        then
          echo ======== sudo yarn application -kill ========$app>> $outfile
        else
          echo ======== not need kill application ========$app>> $outfile
        fi

        #if [ $diff_time -gt $1 ];then

            # result=sudo yarn application -kill ${app}

         #   echo ======== sudo yarn application -kill ========$app>> $outfile

          #  break
        #fi
      done
}

case "$1" in
                kill_by_runtime|-t)
                                kill_by_runtime $2
                                ;;
                asc|-a)
                                asc $2
                                ;;
                kill_by_vcores|-v)
                                kill_by_vcores $2
                                ;;
                *)
                                showhelp
                                exit 1
esac
exit 0
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门