1.初识*.sh文件
shell脚本的目的简单来说就是将用户的命令输入进内核来执行,文件以.sh后缀结尾,在linux或者类linux系统(mac os)下创建语句如下:
touch test.sh
我们可以采用vim来进行编辑该shell脚本,命令如下:
vim test.sh
tip:i表示插入(编辑),Esc表示结束编辑,shift+ZZ表示退出vim,更多命令可自行查阅vim。
创建完shell脚本之后并不是就可以执行了,还需要将其修改为可执行文件,修改命令为:
chmod +X
tip:命令详解可使用info chmod
进行查看
2.第一个shell脚本:hello world
有了第一步的基础,现在我们开始第一个shell脚本程序hello world。
用vim打开test.sh,输入以下内容:
#! /bin/sh
echo "hello world"
echo表示标准输出
现在就需要执行我们的test.sh脚本,命令如下:
sh test.sh
或者:
./test.sh
这样就完成了我们的hello world程序。
3.输入输出
有了第一个程序的基础,后面的工作就轻松了不少。现在我们来学习一下shell脚本简单的输入输出。
#! /bin/sh
echo "input a number"
read number
echo "number is "$number
read命令是用于读取用户键盘的输入,之后将值赋给变量number;
$变量名 是获取变量的值
4.条件控制
程序语言中条件控制是不可或缺的,同样在shell编程中也需要学习条件的控制,我们以最常用的两种if来举例:
第一种:
#! /bin/sh
if (test condition) then
command
else
command
fi
整体来看,if语句是通过if-fi
来确定开始和结束的;另外,test是关键字,用于判断condition的真假。
第二种:
当然,你也可以不使用test关键字,而采用下面的语句来实现:
if [ condition ]; then
command
else
command
fi
[ condition ]用于条件测试,其效果和test关键字一样,特别需要注意的是,”[“两边的空格,以及”]”左边的空格。
关于condition,shell中支持多种类型的条件判断,比如文件/目录、数值、字符串等等,感兴趣的同学可以自行查看。
5.循环
shell和其他程序语言一样提供了循环,这里介绍最常用也是最基本的两种循环:while和for,我们以累加1到100为例进行介绍:
while循环
! /bin/sh
echo "input a number"
read number
index=1
sum=0
while [ $index -le $number ];
do
sum=$[ $sum + $index ]
index=$[ $index + 1 ]
done
echo "sum="$sum
while条件和前面所说的if是一样的,这里需要注意的一点是数值判断不能直接使用<和>,因为shell会对其重定向。
for循环
#! /bin/sh
echo "input a number"
read number
sum=0
for (( index = 1; index <= $number; index++ ));
do
sum=$[ $sum + $index ]
done
echo "sum="$sum
for循环有多种类型,例如集合遍历,语法非常简单,这里就不介绍了。
6.函数
shell对函数的支持和其他语言没有什么太大差异,这里我以下面的函数调用为例:
#! /bin/sh
function fun1 {
echo "first param:"$1
echo "second param:"$2
return 200
}
fun1 1 2
echo "fun1 return:"$?
其中,$?表示上一条命令返回的结果。
7.调试
当我们的shell脚本代码量变大,结构变得复杂时,debug就变得至关重要了。下面我们对两种常用的调试方式进行介绍:
shell内置调试命令
(1)全局调试:
sh -x test.sh
上述命令会输出指定脚本所有代码的调试信息。
(2)局部调试
有时我们不需要这么多信息,而希望有针对性地对某部分代码进行调试,这时我们就可以使用下面的调试方式:
set -x
commands
set +x
调试工具bashdb
bashdb作为shell脚本调试工具,为我们提供了丰富的debug功能。
调试命令如下:
bashdb --debug test.sh
下面给出bashdb常用的几个参数:
l 列出当前行以下的10行
n 执行下一条语句,遇到函数,不进入函数里面执行,将函数当作黑盒
s n 单步执行n次,遇到函数进入函数里面
b 行号n 在行号n处设置断点
d 行号n 撤销行号n处的断点
c 行号n 一直执行到行号n处,如果没有写n参数,则直接执行到下一个断点处
R 重新启动
print $a 表示显示变量a的值
clear 或者d,清除所有的断点
disable / enable 禁用、启用断点
skip [count] 跳过下面一些代码
return 跳出
q 退出bashdb
finish 执行到程序最后