script1_ls

  • 干嘛学习 Scripts
    这个问题可有趣的很了,我为什么要学习 scripts 呢?不要学可不可以呀!?呵呵!如果您只想要『 会用』 Linux 就好的话,那么这一个部分确实可以先跳过去不看也没关系,不过,如果您想要更加的了解与控制 Linux ,使 Linux 运作更顺畅之外,还可以高枕无忧的让你的 Linux Server 在 Internet 上面提供相关服务的话,那么 scripts 还是多少学一学吧!为什么呢?因为 scripts 可以设计到『 很聪明的知道什么条件之下需要进行什么动作!』不要小看这个功能呦!当您不在计算机前面的时候,突然之间,主机被一些不明封包试图入侵了,这个时候如果你的 Linux 主机可以透过『当该封包尝试几次还是联机失败之后,就予以抵挡住该 IP 』,如果可以设计到如此功能的话,呵呵!那么可就不得了了!您的 Linux 主机就可以说是『好聪明呀! smart!』

    除了针对主机之外,其实 scripts 还有相当多的运用功能呦!例如您想要在 Linux 上面作你的作业,而这个作业是一些数值方面的计算,这个时候 Scripts 也可以帮您计算呦!还不需要用到 fortran, c 这类高阶的程序语言呢! scripts 本身就是一个可以用的 program 啰!相当的棒吧!其实, scripts 最开始被新手使用的功能就是『汇整一些在 command line 下达的连续指令,将他写入 scripts 当中,而由直接执行 scripts 来启动一连串的 command line 指令输出入!』例如: 防火墙连续规则 ( iptables ),开机加载程序的项目 ( 就是在 /etc/rc.d/rc.local 里头的资料 ) ,等等都是相似的功能啦! 其实,说穿了,如果不考虑 program 的部分,那么 scripts 也可以想成,仅是帮我们把一大串的指令汇整在一个档案里面,而直接执行该档案就可以执行那一串又臭又长的指令段!就是这么简单啦!

    另外的另外,在编写 scripts 时,在 Linux 当中,最常使用的就是 vi 这一套文书编辑器了,所以啰,为了更简易的控管我们的 Linux ,嗯!还是学习一下好了啦!好不好呀! ^_^


  • scripts 的执行:
嗯!在上一章 bash shell 当中说了一堆变数啦!管线指令啦!等等的,都是为了接着而来的 scripts 的咚咚啦!什么是 script 啊?由字面上的意思来说, script 就是『脚本、剧本』的意思,那够清楚了吧!就是将我们要执行的内容写成一个『脚本』,让系统依据这个『脚本』来执行我们想要的东西!好了!现在我们来讨论一下怎么写 scripts 好了!基本上,一个 script 被执行的时候, bash 会据以判断执行的步骤为:
  1. 如果读取到一个 Enter 符号( CR ),就尝试开始执行该行命令;
  2. 如同前面 bash command 提到的,指令间的多个空白会被忽略掉;
  3. 而空白行也将被忽略掉!,并且 tab 也是不会被理会的!
  4. 至于如果一行的内容太多,则可以使用 \ 来延伸至下一行;
  5. 此外,使用最多的 # 可做为批注!任何加在 # 后面的字,将全部被视为批注文字而被忽略!
然后,在撰写一个 scripts 的时候,最好养成良好的习惯:
  1. 先宣告使用的 shell 为何?(特别留意这一点,在某些状况中,例如 /etc/crontab 情况下,如果没有宣告使用的 shell ,常常会出现错误讯息而导致 scripts 无法被执行呦!)
  2. 注明该 script 的内容功能、版本信息、作者、建文件日期等等
  3. 每一个大步骤的主要功能(也顺便提供自己未来修改之用!)
那么 scripts 这个档案要如何来执行呢?执行的方法有两种:
  • 一个是将该档案改成可以执行的属性,如chmod 755 scripts.file ,然后执行该档案;
  • 另一种则是直接以 sh 这个执行档来执行 script 的内容,如 sh scripts.file
大致上就是这样啦!OK!那么还记得我们在前面一章已经说过了变量的设定方式了吧?好了,那么我们就以第一支 scripts 来将我们设定的变量直接给他 show 出来!嗯!来设计一下这支 script 吧!
  • 建立你的第一支 script:
好了,我们来建立第一支简单的 script 吧!最简单的一个例子,就是在屏幕上列出『 Hello ! How are you ? 』,可以这样写:(注:最常使用来作为 shell scripts 的写作的软件,就是 vi 啦!有空真的要多熟悉一下 vi 呦!)
 
[root @test /root]# mkdir test; cd test  <==建立一个新的目录,所有的 scripts 都暂存在此!
[root @test test]# vi test01-hello.sh
#!/bin/bash                        <==在 # 之后加上 ! 与 shell 的名称,用来宣告使用的 shell
# 这个脚本的用途在于列出 Hello ! How are you 在屏幕上
# 建檔日期: 2002/05/20
# Made by VBird
hello=Hello\ \!\ How\ are\ you\ \?      <==这就是变量啦!
echo $hello

[root @test test]# sh test01-hello.sh
Hello ! How are you ?                   <=输出的结果显示在屏幕上!

这里给他注意一下:

  • 所有在 scripts 里面的东西,基本规则 ( 如变量设定规则 ) 需要与 command line 时相同;
  • scripts 的附档名最好为 .sh 提供他人的认识;
  • 并非加上 .sh 就可以是执行档,还需要查看其属性中是否有 x 这个属性。
呵呵!很兴奋吧!你已经会写 scripts 了呦!已经具有初阶的程序设计能力啰!嗯!是该觉得高兴的!^_^...!好了,接着下来我们写稍微复杂一点的,若一个 script 里头有两个以上的变数要相互引用呢?呵呵!这个时候顺便来比较一下 " 与 ' 的异同吧!
 
[root @test test]# vi test02-2var.sh
#!/bin/bash 
# 这个脚本用途在于引用两个变量,顺便比较一下 " 与 ' 的异同
# Date: 2002/06/27
# Made by VBird
name="V.Bird"
myname1="My name is $name"
myname2='My name is $name'
echo $name
echo $myname1
echo $myname2

[root @test test]# sh test02-2var.sh
V.Bird
My name is V.Bird
My name is $name

看到输出的结果了吧!呵呵!没错!那个 " 与 ' 最大的不同就是在于能不能保有『变量内容』啦!再提醒一次,那个单引号『 ' 』里头的数据都将变成『单纯的字符』而不是有特殊的字体呦!


卷标与运算符号:declare
  • OK!了解了变量的 scripts 写法之后,现在我们来进行一个有趣的实验好了!就是说,当我们在进行『 计算 』的时候,到底 bash 能不能了解我们所给予的是『数字』还是单纯的『字符』呢?这个很重要的,因为会造成系统的误判呦!好了,我们来试试看!当我们需要输出 3 * 5 的结果时,需要如何做呢?用单纯的 command line 一行一行输入的结果如下:
     
    [root @test test]# a=3
    [root @test test]# b=5
    [root @test test]# c=$a*$b
    [root @test test]# echo $c
    3*5  <==糟糕!怎么变成了字符串了?!

    发现了吗?嘿嘿!上面输出的是不是我们所希望的 3*5 = 15 的结果?嗯!这是因为我们没有定义该变量,则该变数预设是呈现『字符串』的型态!那么自然 $c 就成为自串型态了!所以我们需要来宣告一下变量(嘿嘿!跟程序语言很相近吧!也是需要宣告变量的啦!),宣告变量使用的是 declare 这个指令,而变量名称有底下这些啰!


  • declare
    宣告变量内容

    语法
    [test @test test]# declare [-afirx]
    参数说明:
    -a  :定义为数组 array
    -f  :定义为函数 function 
    -i  :定义为整数 integer
    -r  :定义为『只读』
    -x  :定义为透过环境输出变量
    范例:
    [test @test test]# declare -i a=3
    [test @test test]# declare -i b=5
    [test @test test]# declare -i c=$a*$b
    [test @test test]# echo $c
    15  <==变成数字啰! ^_^
初步了解了吧!?好了,现在我们来玩玩看,如果您的计算结果当中,需要输入为 2*3+5*13-32+25 时,并且在最后输出『 Your result is ==> 』该怎样写这一支简单的 script 呢?可以这样试试看:
 
[root @test test]# vi test03-declare.sh
#!/bin/bash
# This program is used to "declare" variables
# VBird 2002/06/27
number1=2*3+5*13-32+25
declare -i number2=2*3+5*13-32+25
echo "Your result is ==> $number1"
echo "Your result is ==> $number2"
[root @test test]# sh test03-declare.sh
Your result is ==> 2*3+5*13-32+25
Your result is ==> 64

怎样?很有趣吧!更好玩的还在后头呦!再往下看一下吧!


对谈式 scripts :
什么是对谈式的 scripts 呢?很简单啦!例如你在执行 Windows 的安装程序时,系统不是常常会跳出一个窗口,问你『下一步』、『上一步』或『取消』吗?那就是对谈啦!程序会依据您输入的数据来进行判断,OK!那么最简单的对谈式指令是什么呢?呵呵!就是 read 这个指令啦! read 的功能就是『 依据您在键盘输入的结果 input 到变量内容中』,例如:
 
[root @test test]# read name
VBird <==这是键盘输入的结果
[root @test test]# echo $name
VBird

好了!那么我们来设定一下,当您的 script 在执行的时候,将您由键盘输入的数据列出来!如何做呢?
 

[root @test test]# vi test04-read.sh
#!/bin/bash
# This program is used to "read" variables
# VBird 2002/06/27
echo "Please keyin your name, and press Enter to start."
read name
echo "This is your keyin data ==> $name"
[root @test test]# sh test04-read.sh
Please keyin your name, and press Enter to start.
VBird Tsai
This is your keyin data ==> VBird Tsai

就是这么简单,我们后面还会继续的谈到判别式,那个时候输入的数据可就更重要了!

好了!下一步我们再来说一说怎样定义一个 script 的参数的代号!?以底下我们的说明为例:
 
[root @test test]# myscript opt1 opt2 opt3 opt4
          $0    $1  $2  $3  $4

这是什么意思呢?嘿嘿!就是说,在这个 script ( myscript )里面,只要变量名称为 $0 就表示为 myscript 这个咚咚,也就是说:

$0 : myscript 亦即是 script 的檔名
$1 : opt1 亦即是第一个附加的参数 (parameter)
$2 : opt2
$3 : opt3
这样说或许不是很清楚,我们来玩一玩底下这个 script 看看就晓得他的意思啦!
 
[root @test test]# vi test05-0123
#!/bin/bash
# This program will define what is the parameters
# VBird 2002/06/27
echo "This script's name => $0"
echo "parameters $1 $2 $3"
[root @test test]# sh test05-0123 pa1 pa2 pa3
This script's name => test05-0123
parameters pa1 pa2 pa3

这个东西在运用上也是相当的重要的,例如当您要取得 script 的名称时(因为有时候使用者会自行更改文件名称),则这个功能变量就相当的重要了!了解乎!?


scripts 逻辑判断式与表达式:
再来的这个东西可就更重要了,尤其在 scripts 当中!那就如『 如何判定某个档案或目录,或者是如何判定程序应该朝向那个方向行进 』?这个东西需要有比较好一些的逻辑概念的说明才行!底下我们分别说明一下逻辑判断式与表达式之后,再来设定几个小 scripts 试试看不同的用法,以期得到大家的了解啰!
  • 逻辑判断式:
    在 scripts 里头很重要的一项工作就是『判断是否可行』的目标!举个例子来说,当我们要建立一个目录的时候,先侦测有没有该目录,如果有的话,那么就不需要建立,如果没有的话,那么就建立该目录!这个就需要 script 来主动的判断了!那么如何判断呢?基本上由于是判断式,那么应该都会与『条件』有关的,所以底下的判断式大多与『 if... then... fi 』这一种条件判断式有关系!这部份后面再提,这里先提一下逻辑判断式的几个重要的咚咚:
     
    逻辑卷标
    表示意思
    1.关于档案与目录的侦测逻辑卷标!
    -f
    常用!侦测『档案』是否存在
    -d
    常用!侦测『目录』是否存在
    -b
    侦测是否为一个『 block 档案
    -c
    侦测是否为一个『 character 档案
    -S
    侦测是否为一个『 socket 标签档案
     -L
    侦测是否为一个『 symbolic link 的档案
     -e
    侦测『 某个东西』是否存在!
    2.关于程序的逻辑卷标!
    -G
    侦测是否由 GID 所执行的程序所拥有
    -O
    侦测是否由 UID 所执行的程序所拥有
    -p
    侦测是否为程序间传送信息的 name pipe 或是 FIFO (老实说,这个不太懂!)
    3. 关于档案的属性侦测!
    -r
    侦测是否为 可读的属性
    -w
    侦测是否为 可以写入的属性
    -x
    侦测是否为 可执行的属性
    -s
    侦测是否为『 非空白档案
    -u
    侦测是否具有『 SUID 』的属性
    -g
    侦测是否具有『 SGID 』的属性
    -k
    侦测是否具有『 sticky bit 』的属性
    4.两个档案之间的判断与比较 ;例如『 test file1 -nt file2
    -nt
    第一个档案比第二个档案新
    -ot
    第一个档案比第二个档案旧
    -ef
    第一个档案与第二个档案为同一个档案( link 之类的档案)
    5.逻辑的『和(and)』『或(or)』
    &&
    逻辑的 AND 的意思
    ||
    逻辑的 OR 的意思

    比较有趣的应该算是 1, 3 这两种种类的判断,尤其是在建立一些 permission 相关的档案时,这个就更重要了!然后那个『两个档案之间的判断』也是挺有意思的!有空的话不妨去试一试去!还有,那个 &&|| 这两个东西也是很重要的!接着下来,我们要来谈一谈运算符号啰!

  • 运算符号简介:
    在 bash shell scripts 的运算符号的加减乘除是怎样的一回事呀!?谈一谈吧!
     
    运算符号
    代表意义
    =
    等于
    !=
    不等于
    <
    小于
    >
    大于
    -eq
    等于
    -ne
    不等于
    -lt
    小于
    -gt
    大于
    -le
    小于或等于
    -ge
    大于或等于
    -a
    双方都成立(and)
    -o
    单方成立(or)
    -z
    空字符串
    -n
    非空字符串

    逻辑判断式与 if...then...fi 的关系是密不可分的,我们底下就先来谈一谈这一个判断式当中最常使用的语法吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值