13 学习 shell scripts

shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。shell script 可以简单的被看成是批量文件, 也可以被说成是一个程序语言,且这个程序语言由于都是利用 shell 与相关工具命令, 所以不需要编译即可运行,且拥有不错的除错 (debug) 工具,所以,他可以帮助系统管理员快速的管理好主机。

Linux 系统的服务 (services) 启动的介面是在 /etc/init.d/ 这个目录下,目录下的所有文件都是 scripts 。


 /home/dmtsai/shell.sh运行这个文件?

1.直接命令下达: shell.sh 文件必须要具备可读与可运行 (rx) 的权限,然后:

  • 绝对路径:使用 /home/dmtsai/shell.sh 来下达命令;
  • 相对路径:假设工作目录在 /home/dmtsai/ ,则使用 ./shell.sh 来运行
  • 变量『PATH』功能:将 shell.sh 放在 PATH 指定的目录内,例如: ~/bin/
2.以 bash 程序来运行:透过『 bash shell.sh 』或『 sh shell.sh 』来运行

script 的运行方式差异 (source, sh script, ./script)
  • 利用直接运行的方式来运行 script当使用直接命令下达 (不论是绝对路径/相对路径还是 $PATH 内),或者是利用 bash (或 sh) 来下达脚本时, 该 script 都会使用一个新的 bash 环境来运行脚本内的命令!也就是说,使用者种运行方式时, 其实 script 是在子程序的 bash 内运行的!
  • 利用 source 来运行脚本:在父程序中运行e.g. source sh02.sh     sh02.sh 会在父程序中运行的,因此各项动作都会在原本的 bash 内生效!


利用 test 命令的测试功能

test -e /dmtsai
关于某个档名的『文件类型』判断,如 test -e filename 表示存在否
-e 该『档名』是否存在?(常用)
-f 该『档名』是否存在且为文件(file)?(常用)
-d 该『档名』是否存在且为目录(directory)?(常用)


利用判断符号 [ ]
[ -z "$HOME" ] ; echo $?
使用中括号必须要特别注意,因为中括号用在很多地方,包括通配符与正规表示法等等,所以如果要在 bash 的语
法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字节来分隔!
注意:
在中括号 [] 内的每个组件都需要有空白键来分隔;
在中括号内的变量,最好都以双引号括号起来;
在中括号内的常数,最好都以单或双引号括号起来。

中括号的使用方法与 test 几乎一模一样, 只是中括号比较常用在条件判断式 if ..... then ..... fi 的情况。  


Shell script 的默认变量($0, $1...)
/path/to/scriptname  opt1  opt2  opt3  opt4 
       $0                        $1       $2     $3      $4
$# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
$@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
$* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字节,默认为空白键, 所以本例中代表『 "$1 $2 $3 $4" 』之意



单层、简单条件判断式
如果你只有一个判断式要进行,那么可以简单的这样看:
if [  条件判断式  ]; then
         当条件判断式成立时,可以进行的命令工作内容;
fi   <==将 if 反过来写,就成为 fi !结束 if 之意!

多个条件判断 (if ... elif ... elif ... else) 分多种不同情况运行
if [  条件判断式一  ]; then
    当条件判断式一成立时,可以进行的命令工作内容;
elif [ 条件判断式二 ]; then
    当条件判断式二成立时,可以进行的命令工作内容;
else
     当条件判断式一与二均不成立时,可以进行的命令工作内容;

fi


利用 case ..... esac 判断
case  $变量名称 in   <==关键字为 case ,还有变量前有钱字号
  "第一个变量内容")   <==每个变量内容建议用双引号括起来,关键字则为小括号 )
                       程序段
                           ;;            <==每个类别结尾使用两个连续的分号来处理!
  "第二个变量内容")
                      程序段
                           ;;
  *)                  <==最后一个变量内容都会用 * 来代表所有其他值
                     不包含第一个变量内容与第二个变量内容的其他程序运行段
                     exit 1
                           ;;
esac                  <==最终的 case 结尾!『反过来写』思考一下!

利用 function 功能
function fname() {
程序段
}
function 也是拥有内建变量的~他的内建变量与 shell script 很类似, 函数名称代表示 $0 ,而后续接的变量也是以 
$1, $2... 来取代的。

while do done, until do done (不定回圈)
while [ condition ]  <==中括号内的状态就是判断式
do            <==do 是回圈的开始!
         程序段落
done          <==done 是回圈的结束

until [ condition ]
do
         程序段落
done
当 condition 条件成立时,就终止回圈, 否则就持续进行回圈的程序段。

for...do...done (固定回圈)
for var in con1 con2 con3 ...
do
          程序段
done
以上面的例子来说,这个 $var 的变量内容在回圈工作时:
第一次回圈时, $var 的内容为 con1 ;
第二次回圈时, $var 的内容为 con2 ;
第三次回圈时, $var 的内容为 con3 ;
....

for...do...done 的数值处理

除了上述的方法之外,for 回圈还有另外一种写法!语法如下:
for (( 初始值; 限制值; 运行步阶 ))
do
          程序段
done
初始值:某个变量在回圈当中的起始值,直接以类似 i=1 配置好;
限制值:当变量的值在这个限制值的范围内,就继续进行回圈。例如 i<=100;
运行步阶:每作一次回圈时,变量的变化量。例如 i=i+1。

shell script 的追踪与 debug
 sh [-nvx] scripts.sh
选项与参数:
-n  :不要运行 script,仅查询语法的问题;
-v  :再运行 sccript 前,先将 scripts 的内容输出到萤幕上;
-x  :将使用到的 script 内容显示到萤幕上,这是很有用的参数!

总结:

  1. shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文字档,将一些 shell 的语法与命令(含外部命令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。
  2. 在 Shell script 的文件中,命令的运行是从上而下、从左而右的分析与运行;
  3. shell script 的运行,至少需要有 r 的权限,若需要直接命令下达,则需要拥有 r 与 x 的权限;
  4. 良好的程序撰写习惯中,第一行要宣告 shell (#!/bin/bash) ,第二行以后则宣告程序用途、版本、作者等
  5. 对谈式脚本可用 read 命令达成;
  6. 要创建每次运行脚本都有不同结果的数据,可使用 date 命令利用日期达成;
  7. script 的运行若以 source 来运行时,代表在父程序的 bash 内运行之意!
  8. 若需要进行判断式,可使用 test 或中括号 ( [] ) 来处理;
  9. 在 script 内,$0, $1, $2..., $@ 是有特殊意义的!
  10. 条件判断式可使用 if...then 来判断,若是固定变量内容的情况下,可使用 case $var in ... esac 来处理
  11. 回圈主要分为不定回圈 (while, until) 以及固定回圈 (for) ,配合 do, done 来达成所需任务!
  12. 我们可使用 sh -x script.sh 来进行程序的 debug

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值