Linux 的shell脚本基础编程总结

时间:2022-01-04 15:36:38

Linux的Shell种类众多,常见的有四种:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
我们关注的重点是Bash(Bourne Again Shell)易用和免费:

#!/bin/sh
#这里是注释行

首行:符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。
第二行:以#开头的行就是注释行,直到此行的结束。
编辑完毕:将脚本存盘为XXX.sh,文件名后缀sh表明这是一个Bash脚本文件。
执行脚本:先将脚本文件的属性改为可执行的,

chmod +x XXX.sh

执行脚本的方法是:

./XXX.sh
或者是
sh XXX.sh #要在当前文件目录下,或者使用绝对路径

完整版例子一个:

#!/bin/sh 
#print hello world in the console window
a = "hello world"
echo $a #输出结果为:hello world

注意:Shell Script是一种弱类型语言,使用变量的时候无需声明其类型,是全局变量,变量归当前的Shell所有,任何子进 程都不能访问本地变量。一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加 XXX可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号{ }来区分:

#!/bin/sh 
#print hello world in the console window
a="hello" # 注意:赋值操作 = 的两边一定不能有空格!!!
echo $a #>>>输出结果为hello
echo $ac #>>>输出结果为 空 因为ac未赋值
echo ${a}c #>>>输出结果为helloc
echo "Hi,$ac" #>>>输出结果为Hi, 因为ac未赋值
echo "Hi,${a}c" #>>>输出结果为Hi,helloc

来一个复杂的例子详细解析一下:

#!/bin/sh 
# 开头一定要用固定格式
# 注释在# 后面只到行结束

#if函数是用对称的if和fi

# $# 表示包括$0在内的命令行参数的个数。在Shell中,
# 脚本名称本身是$0,依次是$0、$1、$2…、${10}等等。
# $* 表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。
if [ $# -lt ];
then
# <<HE。。。HE 被称为Here文档用于将多行文本传递给某一命令
# <<开头,后面跟任意字母,结束用相同的字母
cat<<HE
Here文档通常会放置多行文本
用来做提示信息,
在运行时会将全部文本打印出来
HE
#此处的exit是Linux的命令,表示退出当前进程。
exit
fi #if函数结束

OLD="$" #分别将第一和第二参数赋值给变量OLD和NEW。
NEW="$"
shift #两条shift的作用是将参数列表中的第一个和第二个参数删除,
shift #后面的参数依次变为新的第一和第二参数,注意参数列表不包括$0

if [ -f "$file" ];
then
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile" ];
echo "ERROR: $newfile exists already"
else
echo "renaming
mv "
$file" "$newfile"
fi
fi
done

if函数详解:
Shell Script中if语句的条件部分要以分号来分隔。第三行中的[]表示条件测试,常用的条件测试有下面几种:

[ -f “ file"] file是否是一个文件

[ alt3] a的值是否小于3,同样-gt和-le分别表示大于或小于等于

[ -x “ file"] file是否存在且有可执行权限,同样-r测试文件可读性

[ -n “ a"] a是否有值,测试空串用-z

[ “ a"=" b” ] 判断 a b的取值是否相等

[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立

要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就**会出错。
函数声明详解:
shell允许将一组命令集或语句形成一个可用块,称为shell函数;函数名前关键字function 加或者不加都可以;
函数可以放在同一个文件中作为一段代码,也可以放在只包含函数的单独文件中。函数不必包含很多语句或命令,甚至可以只包含一个echo语句,这取决于使用者。

格式如下:

函数名(){
command1
command2
...
commandN
[ return value ]
}

下面的例子定义了一个函数并进行调用:

#!/bin/bash
demoFunc(){
echo "aaaaa"
}
echo "bbbbb"
demoFunc #注意:函数调用只需要函数名,不要加()
echo "ccccc"

输出的结果为:
bbbbb
aaaaa
ccccc