shell脚本达成监督shell脚本的实践流程及变量的值,shell脚本中撤消重定向的章程实例

无数时候,大家都会写shell程序来成功部分不用再行造轮子的时刻,然则,又因为shell语句中也可能有函数,也可以有变量,在运营后到底实行了何等相关的操作,就供给对切实实施进度中的变量等可变的要素的监察,那么大家上面就写个小小的shell例子,来成功那些对执行进度中标准语句中的变量的浮动的监督检查和全部程序的施行流程的观看比赛。

在上1篇关于shell编制程序的事例中,有讲到把shell脚本实行扩充之后重定向到一个文本中,以便举办查看和调护医治//www.jb51.net/article/62435.htm。但是,即使有另一种处境:只是在一些地点开始展览重定向,而别的地点不开始展览重定向。那么大家就来修改一下上一篇中的例子来拓展这种必要的知足:

基准测试

shell 条件测试0为真,一为假

test

[ ] 

[[ ]]

参数之间利用空格隔开分离

测试命令

-d 存在且为目录

-f 存在且为普通文书

-z 字符串长度为0

-n 字符串长度非0

str一 = str二 字符串同样为真

str1 != str二 分歧等为真

arg1 op arg2

-eq 相等
-ne 不等
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于

shell程序代码:

复制代码 代码如下:

逻辑操作


-a and
-o or

七个好的习贯

X${str壹} == X${str2}
字符串比较假如3个为空,那么会错误举办,可以追加前缀幸免
变量取值放在””之间,理由同上

复制代码 代码如下:

#!/bin/bash
function setlogfile
{
    if ! [ -z “$1” ]; then
        echo “logfilename is not empty!” >> kthh
        exec 3>&1
        exec 4>&2
        exec 2>> $1
        exec 1>> $1
    fi   
}

分支

if/then/elif/else/fi

#!/bin/bash
# ##################
echo “if..else if fi”
read num
if [[ $num -eq 100 ]]; then  
 #讲话放在同1行时应该以分行隔断
    #statements
    echo “num=100”
elif [[ $num -lt 100 ]]; then
    #statements
    echo “num<100”
else
   # echo “num>100”
  : #空体应当是用冒号,,冒号作为3个下令,结果连续为真
fi

越来越好做法

[  ] && {}
或者[  ] || {}

case命令

case/esac

case $_op in
    “+” )
    (( sum=$num1+$num2 ))
    printf “$num1 $_op $num2 = %s\n” “$sum”
    ;;
  “+”)
  :
  ;;
  *)
  ;;

#!/bin/bash
function setlogfile
{
    if ! [ -z “$1” ]; then
        echo “logfilename is not empty!” >> kthh
        exec 2>> $1
        exec 1>> $1
    fi   
}

num1=$1
logfile=$2
execlogfile=$3

循环语句

do/done用于标志1个语句块的开头和竣事,可以献身for行用分号隔开分离

#!/bin/bash
for i in {a..z}
do
    echo “printf val is : $i”
done

一个例证:1+二+..+拾0=十50

#!/bin/bash
str=`seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’`
printf ${str}=
echo `seq 1 1 100 | tr ‘\n’ ‘+’ | sed ‘s/+$/\n/’ | bc `

执行结果

1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100=5050

另壹种达成格局
sum=0
str=””
for (( i = 0; i < 101; i++ )); do
    #statements
    (( sum = $i + $sum))
    str=$str${i}
    if [[ $i -eq 100 ]]; then
        #statements 
        break
    fi
    str=$str’+’
done
echo ${str}=$sum

while [ : ];do :;done

num1=$1
logfile=$2
execlogfile=$3

setlogfile ${execlogfile}
set -x
if [ $num1 -eq 0 ]; then
    echo “num1 is 0”>> ${logfile}
elif [ $num1 -ge 0 ]; then
    echo “num1 is grate 0”>> ${logfile}
else
    echo “num1 is less 0”>> ${logfile}
fi
exec 2>&4
exec 1>&3
if [ $num1 -eq 0 ]; then
    echo “num1 is 0 again”>> ${logfile}
fi

网赌十大信誉的平台,岗位参数和特别变量

$0 地方参数0
$1 …
$2 …

$# 也便是参数个数argc-一
$@参数列表…  $一$贰$叁….
$* 同上
$?上一条命令的exitstatus
$$当前shell的经过号
岗位参数能够选用shift命令左移(覆盖前面包车型地铁n个参数)会转移$#  $@

setlogfile ${execlogfile}
set -x
if [ $num1 -eq 0 ]; then
    echo “num1 is 0”>> ${logfile}
elif [ $num1 -ge 0 ]; then
    echo “num1 is grate 0”>> ${logfile}
else
    echo “num1 is less 0”>> ${logfile}
fi
/sbin/shutdown -k 10
if [ $num1 -eq 0 ]; then
    echo “num1 is 0 again”>> ${logfile}
fi

在函数setlogfile中增加了exec 三>&一;exec
四>&2那两句,而里边,叁、1、四、2都是意味着文件描述符,1是专门的学业输出,也正是STDOUT,二是行业内部错误输出,正是STDE普拉多PAJERO,一和二本来是出口在显示屏上的,而叁、四是意味着多少个公文描述符,可通晓成是五个保存壹和2的近些日子变量,
3>&一表示把公文讲述符1的赋值给文件讲述符三,也足以精通为是把文件讲述符1(当前标准输出)的条条框框保存到了文本讲述符叁中,那时再把一的输出重定向到文件中,在底下的shell程序中,大家又利用了1>&三那就象征是把保存在文件讲述符叁中的原职业输出的平整重新赋值给文件讲述符一,原来标准输出的规则是出口到显示屏上,而不是出口到一个文本中。那正是成套重定向和撤消重定向还原的经过。2和四也是均等的道理。

函数

函数定义

FUNCNAME(){
}
function关键字可选
函数调用eg is_dir    #没有须要参数,参数获取使用$@

#!/bin/bash
function is_dir(){
    local dir=$1
    if [[ -d $dir ]]; then
        #statements
        return 0
    else
        return 1
    fi
}

调试
-n 读一遍脚本中命令但不施行,用于检查脚本中的语法错误
-v
-x 提供追踪实施音信,将实行的每一条命令和结果依次打字与印刷出来

二种办法应用

#/bin/bash -x
$ sh -x ./test.sh
在剧本中动用set -x 和 set +x 对台本中某一段代码实行追踪

在指令行中实施:

闲话少说,先看运转结果:

数组

bash不援助多维数组,并且未有限定数组大小.(无越界之说)下标从0伊始

定义:

array_name=(value1..valuen)
或者
array_name[0]=””
array_name[3]=””
array_name[6]=””

读取
${arrname[index]}
echo ${arr[*]}
收获字符串长度大概数CEO度
i=${#arr[@]}

复制代码 代码如下:

复制代码 代码如下:

[root@UFO shellprogram]# ./testexecutelog.sh 0 msglog execlog

[root@UFO shellprogram]# ./testexecutelog.sh 0 msglog execlog

在以上的shell脚本程序中 num一对应的值为命令行中的0  logfile的值为msglog 
execlogfile的值为execlog。

  • exec
  • ‘[‘ 0 -eq 0 ‘]’
  • echo ‘num1 is 0 again’

函数 setlogfile的运用为 setlogfile 日志文件名,在例子中的使用setlogfile
${execlogfile},函数中的exec 二>> $1;exec 一>>
$1表示把标准输出和标准错误输出的信息都重定向到execlog文件中。

[root@UFO shellprogram]# cat execlog

上边大家来看看execlogfile中的内容,就足以见到shell程序的实践流程和施行进度中的变量的值的更改。

  • ‘[‘ 0 -eq 0 ‘]’
  • echo ‘num1 is 0’
  • exec

复制代码 代码如下:

看看结果了吧??? 没看到么??? 那就仔细看了,^_^

[root@UFO shellprogram]# cat execlog

你只怕感兴趣的篇章:

  • shell 壹>&二 二>&1&>filename重定向的意思和不相同
  • Linux base shell重定向详解
  • linux
    shell数据重定向(输入重定向与输出重定向)详细剖判
  • shell常用重定向实例解说
  • linux shell
    管道命令(pipe)使用及与shell重定向分化
  • linux shell
    脚本完结tcp/upd协议通信(重定向应用)
  • Windows Powershell
    管道和重定向
  • Shell脚步战术之管道重定向基础
  • Shell中重定向的中肯解说
  • ‘[‘ 0 -eq 0 ‘]’
  • echo ‘num1 is 0’
  • /sbin/shutdown -k 10
  • ‘[‘ 0 -eq 0 ‘]’
  • echo ‘num1 is 0 again’

可知,程序中的流程是和./testexecutelog.sh后的首先个参数决定的。你仍是能够把第一个参数改为大于0的或小于0的值实行测试。

里头,最要紧的一句是set
-x,此句的意义为:在每一个轻松命令被扩大之后,展现PS四增加值,之后是要实行的命令

若不进行那句,则不会将施行中变量的实际值打字与印刷到execlog中。有关set的使用可man
set领会越来越多。

留意:exec 在对文件讲述符实行操作的时候,也唯有在那时,exec
不会覆盖你眼下的 shell 景况。也正是不会运行个新的进度。

你恐怕感兴趣的篇章:

  • Shell脚本实现Linux系统和经过财富监察
  • Shell脚本达成监督MySQL主从同步
  • Shell脚本完成监控iptables运营境况
  • Shell脚本达成监察和控制rsync数据是还是不是传输完
  • Shell脚本达成监督kingate并自动运行
  • Shell脚本完结监察和控制iptables规则是不是被涂改
  • Shell脚本实现memcache缓存命中率监察和控制
  • 贰个监察和控制Squid运营进度数并机关重启的简洁Shell脚本分享
  • Shell脚本编写Nagios插件监察和控制程序财富占用
  • Linux服务器硬件运市价况及故障邮件提示的监察脚本分享

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注