shell脚本

今天我将shell脚本的基本编写语法学习心得与大家一起分享,请大家多多指点

脚本的作用使得我们的任务能够成批量自动完成,而不用我们再一个个的手动执行,脚本的编写语言有很多中,比如cc++c#perlshell等等,今天我们主要学习的就是shell脚本的编写,而脚本的编写是遵从一定的语言法则,下面我们就重点说明一下shell脚本的几种常用语言:ifforcasewhileuntil

 

脚本中经常使用的比较变量:

字符串比较:

==:如果两个字符串相等,则为是

!=:如果两个字符串不想等,则为是

-n:如果字符串的长度大于零,则为是

-z:如果字符串的长度等于零,则为是

数字的比较:

-eq:两个数字相等。则为是

-ge$1大于等于$2,则为是

-le$1小于等于$2,则为是

-ne:两个数字不想等,则为是

-gt$1大于$2,则为是

-lt$1小于$2,则为是

文件比较:

-d:对象存在且是目录,则为是

-f:对象存在且是普通文件,则为是

-L:对象存在且是连接文件,则为是

-r:对象存在且有可读权限,则为是

-w:对象存在且有可写权限,则为是

-x:对象存在且有执行权限,则为是

-s:对象存在且不是空文件,则为是

!:对测试条件的否定

逻辑关系:

-a:逻辑与,优先级大于逻辑或

-o:逻辑或,优先级最小

!:逻辑非,优先级最高

常用的执行脚本命令:

# bash [options] 脚本名

-x 查看脚本执行的详细信息;常用

 

单条件判断:if

if语句一般使用在判断性执行环境中,语句格式为:

如果条件是正确的,就执行命令;否则执行其他,退出

单分支if语句:简单的if语句,如果条件判断正确则执行,否则什么也不做;此时只能判断单一的一个正确条件,脚本功能比较单一,不能完成复杂任务

if 判断条件; then

statement

fi

双分支if语句:如果条件判断正确,则执行一,否则执行二,然后退出;此时只能对一个条件进行判断执行,功能比较单一

if 判断条件; then

statement1

else

statement2

fi

多分支if语句:如果条件一判断正确则执行一,否则判断条件二,正确执行二,以此类推,如果条件都不正确,则执行最后一个,然后退出;此时脚本功能比较完善,能够应对诸多可能发生的情况,可以完成比较复杂的任务

if 判断条件一; then

stament1

elif 判断条件二; then

stament2

elif 判断条件三; then

stament3

...........

else

stament*

fi

实例:一、如果文件test为空,则输入内容this is test file

# touch test

# vim te.sh

#!/bin/bash

#

HANG=`wc -c test | cut -d' ' -f1`

if [ $HANG -eq 0 ]; then

echo this is test file > test

fi

执行并查看结果:

此时脚本只能在文件test存在时才能判断,且只能对test为空文件时做出动作

二、判断文件test是否存在,如果不存在,就创建并输入内容;否则输出文件已存在

#!/bin/bash

#

CUNZAI=`ls test &> /dev/null`

ZHUANGT=`echo $?`

if [ $ZHUANGT -eq 0 ]; then

echo "file exise"

else

touch test

echo "this is test file" > test

fi

执行并查看结果

此时脚本执行之后会先判断文件test是否存在,如果存在则输出已经存在,如果不存在则先创建此文件,然后再输入内容;此时的脚本已经初步具备判断能力

三、判断脚本后边跟的参数,如果为-s则显示指定类型的用户,如果为-h则显示脚本用法,否则显示未知参数

#!/bin/bash

#

if [ $1 == '-d' ]; then

  Userdel -r $2

elif [ $1 == '-D' ];then

  Userdel -r $2  

Elif [ $1 == -a ]; then

  Useradd $2

  `Echo $2 | passwd --stdin $2 &> /dev/null`

Elif [ $1 == -A ]; then

Useradd $2

`Echo $2 | passwd --stdin $2`

else

  Echo unknow choice

  exit 8

fi

此脚本执行时判断如果第一个参数为-d,则删除给出的用户;如果是-D,则删除给出的用户;如果是-a-A选项,则创建新用户$2,并将新创建用户的密码更改为自己的用户名;如果都不是,就告诉用户错误选项,并退出;此时脚本可以匹配多个选项并对应做出不同的动作,此时脚本已经可以满足基本的需求

 

简单循环体:for

For 语句一般使用在简单的循环环境中,需要给出明确的循环体,语法格式为:

For 变量 in 列表;do

要做的动作

Done

脚本执行之后,变量会在列表中取值并做出动作,然后依次遍历列表,遍历列表之后自动退出;而列表的生成有不同的方法,如

数字的列表可以直接使用数字表示即可:{1..100} 从一到一百,也可以使用命令`seq 100`,或者1 1 100,定义开始数字,每次加多少,结束数字;

命令的列表:直接将命令结果引用即可,反引号;

计算50以内4的倍数的和;此时如果使用if语句则非常麻烦,极易出错,而是用for循环即可解决此问题;先考虑生成列表,4的倍数就是能被4整除的数,也可理解为两者之差是4的数,所以这个列表可以写成:`seq 0 4 50`,执行脚本可以写为:

#!/bin/bash

#

declare-i I=0。。。。。。。。。。。。。。。。。。。declare声明变量

declare -i SUM=0

for I in `seq 0 4 50`; do

let SUM=$[$SUM+$I]。。。。。。。。。。Let计算

done

echo this sum is $SUM

此时的执行结果会算出50以内4倍数的和,并将其输出到屏幕上;

 

另一种使用for循环语句的语法:

#!/bin/bash

#

declare -i SUM=0

for ((I=1;I<=100;I++))

do

let SUM=$[$SUM+$I]

done

 

多条件判断:case

if判断相似,同样需要手工输入判断条件,只是条件可以更多;case常用语法是:

case 变量 in

条件一)

命令一

;;

条件二)

命令二

;;

.....

esac

此时如果变量满足条件一,则执行一,以双分号结束;满足条件二,则执行命令二,以此类推;到esac则脚本结束

#!/bin/bash

#

case $1 in

-a|--add)

useradd $2

echo $2 | passwd --stdin $2

;;

-d|--del)

userdel $2

;;

-h|--help)

echo Userage: -a|--add -d|--del -h|--help

;;

*)

echo Userage: -a|--add -d|--del -h|--help

exit 2

;;

esac

 

 

正条件循环:while

while循环需要一定的进入条件,并不是直接进入循环,开始条件是:“如果命令执行状态为正确,则开始进入循环体,否则退出”;如

#!/bin/bash

#

declare -i SUM=0

read -p qing shu ru yi ge shu:  SR

while [ $SR -le 100 ]; do

let SUM+=$SR

let SR++

done

echo this sum is $SUM

 

非条件循环:until

until循环同样需要一定的进入条件,开始条件和while刚好相反:“如果命令执行状态为错误,则开始进入循环体,否则退出”;如

#!/bin/bash

#

declare -i SUM=0

read -p qing shu ru yi ge shu:  SR

until [ $SR -gt 100 ]; do

let SUM+=$SR

let SR++

done

echo this sum is $SUM

 

 

Shell脚本学习尚浅,以后会有更多更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章