Shell原创
原创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
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除