shell是一个命令行解释器,采用交互的方式,遵循相应的语法规则将输入的命令加以解释,并传给系统,即是一种命令语言,也是一种程序设计语言,是用户使用linux的桥梁;
shell文件是由shell命令组成的文件,vim文本编辑的,不可编译,vim文件保存后,不具备执行权限,需要采用命令chmod改变文件属性(chmod x+filename),增加权限后即可执行;即shell编程有三个步骤:
![](https://img-blog.csdnimg.cn/img_convert/045ded64dff73103d32959ea3b886a2e.png)
shell的两个版本
![](https://img-blog.csdnimg.cn/img_convert/8bd5d81570b667f058c25de570ae4a97.png)
shell编程都是一样的
#!/bin/sh //告诉linux内核使用的shell版本为sh;
shell编程注意点
赋值(=)的左右两边不能有空格;
echo是输出命令
if语句分为单分支、双分支、多分支;if后面必须加条件,条件后必须有then关键字;单双分支结尾必须有且仅有1个fi;多分支结尾必须有2个fi;且条件表达式中[]该符号向里必须有一个空格,里面的判断条件,例如=左右两边必须有空格;
默认系统变量,变量结合是先右后左
$#:传入脚本的命令行参数个数(不包含命令本身)
$*:所有命令行参数值、在各参数值之间有空格
$o:命令本身
&&、||
与或条件判断运算符具有短路特性,即当运算符前面的表达式能够决定该语句的结果(1/0),程序就不会查看运算符后面的表达式;例如当与运算符前面的表达式是0,则整个语句都是假;或条件运算符前面的表达式是1,则整个语句是真;
shell中的for循环
for var in [list] //var是变量,list是依次取列表内所有的内容
do //可以看出,for/do/done是shell的关键保留字
#code block
done
一个例子:实现查询对应或者当前目录下一共有几个文件:
#!/bin/bash
counter=0
for files in * //*是通配符
do
counter=`expr $counter+1`
done
echo "There are $conuter files in `pwd` we need to process"
另一个例子:一个星期有多少天:
#!bin/bash
for day in sun mon tue wed thu fri sat
do
echo $day //本行变量前面必须添加$符号
done
shell中的whlie:条件为真时运行
一个例子:时间数字倒序输出:
#!/bin/bash
echo -n "please enter number:"
read n
sd=0
rev=""
on=$n
echo "$n"
while [ $n -gt 0 ]
do
sd=$(( $n % 10 )) # get Renainder
n=$(( $n / 10 )) #get next digit
rev=$( echo $rev$sd)
done
echo "$on in a reverse order $rev"
shell中的until循环:条件为假时运行
一个例子:将文件移动到对应目录,若目的地有同名文件则对该文件进行监视,当目标地的文件被删除后,进行移动,并报告结果:
#!/bin/bash
if [ "$s1" = "" ] || [ "$s2" = ""] //注意[]向内必须留有一个空格
then
echo "please enter file name"
exit 1
fi
if [ -e $s2 ]
then
echo "the file already exists"
until [ ! -f $s2 ]
do
sleep 1
done
fi
if [ ! `mv $s1 $s2` ]
then
echo "mv sucessful"
else
echo "mv error"
fi
shell函数调用
函数在shell中调用成功后返回值0(注意与C语言不同),函数调用不成功则返回值1;
shell中的case语句,case语句的结尾必须以esac结尾(反写case);
一个例子:输入对应字母,返回对应字母(更改后的):
#!/bin/bash
echo "hit a key,then hit ruturn."
read Keypress
case "$Keypress" in
[A-Z]) echo "Uppercase letter";; //注意这里只有一个‘)’,没有前面的一半;
[a-z]) echo "Lowercase letter";;
[0-9]) echo "Digit";;
*) echo "Punxtuation,whitespace,or other";;
esac