今天我将shell脚本的基本编写语法学习心得与大家一起分享,请大家多多指点
脚本的作用使得我们的任务能够成批量自动完成,而不用我们再一个个的手动执行,脚本的编写语言有很多中,比如c,c++,c#,perl,shell等等,今天我们主要学习的就是shell脚本的编写,而脚本的编写是遵从一定的语言法则,下面我们就重点说明一下shell脚本的几种常用语言:if,for,case,while,until
脚本中经常使用的比较变量:
字符串比较:
==:如果两个字符串相等,则为是
!=:如果两个字符串不想等,则为是
-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脚本学习尚浅,以后会有更多更新