美文网首页Shelllinux
七、构建shell脚本

七、构建shell脚本

作者: Miridescent | 来源:发表于2018-05-29 18:08 被阅读12次

    简单目录

    • 1.创建shell脚本
    • 2.使用变量
    • 3.命令替换
    • 4.重定向输入或输出
    • 5.管道
    • 6.执行数学运算
      -- expr命令
      -- 使用方括号
      -- bash计算器bc
    • 7.退出脚本

    1.创建shell脚本

    打开vim,开始写shell脚本
    下面开始第一个简单的脚本

    #!/bin/bash
    # 输出当前日期
    echo -n  输出日期
    date
    
    # 输出操作者
    echo 输出操作者
    who
    

    上面的脚本运行后的结果是

    [root@jdu4e00u53f7 msdir]# test1
    -bash: test1: 未找到命令
    [root@jdu4e00u53f7 msdir]# ./test1
    输出日期2017年 08月 23日 星期三 15:29:31 CST
    输出操作者
    root     pts/0        2017-08-23 14:26 (221.217.181.233)
    

    *注意 运行的时候,我直接输入test1会提示找不到命令,要用./test1执行脚本(也就是脚本的的位置),也可用命令/home/msdir/test1执行脚本

    *注意 另一种执行脚本的做法是将脚本所处的目录添加到PATH环境变量中

    上面就是一个简单的shell脚本,下面对内容做一下说明
    1.在创建shell脚本的时候,必须在文件的第一行指定要使用的shell
    2.通常在脚本中#表示注释行,但是只有在第一行的时候是例外
    3.echo是输出文本字符串,当想让命令输出和文本字符串在一行的时候可以用参数-n,格式如脚本中的第三行
    *注意 echo命令可以用单引号或者双引号来划定文本字符串,如果在字符串中用到单引号或双引号,用另外一种将字符串划定起来,例如要输出字符串Let's go,则如下

    echo "Let's go"
    

    例如要输出字符串say "come on!".
    则如下

    echo 'say "come on!".'
    

    2.使用变量

    前面讲到的shell中维护的这一组变量都可以直接在脚本中使用,只要在变量前加$符号即可,如下

    echo PATH=$PATH
    

    输出结果如下

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    

    查询有哪些变量可用,用set命令

    *注意 如果想要输出$PATH的话可直接用\$转义,语句如下

    echo \$PATH
    

    在脚本中自定义用户变量直接通过=赋值即可
    例如

    var1=123
    var2="我是一个变量"
    var3=我也是一个变量
    echo var1=$var1
    echo var2=$var2
    echo var3=$var3
    

    输出结果如下

    var1=123
    var2=我是一个变量
    var3=我也是一个变量
    

    *注意 变量可由字母数字下划线组成,长度不超过20字符,区分大小写
    *注意 变量赋值字符串时带引号和不带引号作用相同
    *注意 可以通过$符号通过变量给变量赋值,例如var4=$var3

    3.命令替换

    从命令输出中提取信息,将其赋给变量,这样在脚本中就可以随意使用输出信息了,有两种方法
    方法1 `字符(注意这是反引号字符,不是单引号)
    用两个反引号将命令行围起来,例如:

    testing=`date`
    echo $testing
    

    输出结果

    2017年 08月 24日 星期四 16:21:54 CST
    

    方法2 $()
    例如:

    testing2=$(date)
    echo $testing2
    

    输出结果

    2017年 08月 24日 星期四 16:21:54 CST
    

    4.重定向输入或输出

    重定向将命令的输出发送到一个文件中 >

    ➜  date>test
    ➜  cat test
    2018年 5月29日 星期二 16时00分28秒 CST
    

    向文件末尾追加数据 >>

    ➜   who>>test
    ➜   cat test
    2018年 5月29日 星期二 16时00分28秒 CST
    a824810056 console  May  2 09:06 
    a824810056 ttys000  May 25 10:06 
    a824810056 ttys001  May 17 18:05 
    a824810056 ttys002  May 28 14:17 
    

    输入重定向<

    ➜  wc<test 
           5      25     184  
    

    wc命令对数据中的文本进行计数,输出数据对应的是文本的行数、文本的词数、文本的字节数
    内联输入重定向<<
    看例子

    ➜ wc<<eof
    heredoc> string1
    heredoc> string2
    heredoc> eof
           2       2      16
    

    输入时有一个标记eof,直到在此遇到标记的时候表示输入终止

    5.管道

    当一个命令产生一个数据,然后该数据再被别的命令使用的时候,可以通过从定向输入和输出,通过一个中间文件达成目的
    通过管道可以去掉中间文件的存在,在数据被第一个命令产生的时候直接被第二个命令使用
    例如:

    ➜  date>test
    ➜  sort<test
    

    和下面的功能是一样的

    ➜ date|shrt
    

    *注意 管道不会产生任何中间文件和缓存
    *注意 一条命令中可以使用多条管道
    *注意 管道和重定向可同时使用

    6.执行数学运算

    expr命令

    ➜ expr 1 + 5
    6
    

    expr支持一些简单的运算符,但是问题来了,有一些运算符在脚本中有别的用途,例如*
    解决这个问题,在运算符之前加转义字符\

    ➜  ~ expr 1 \* 5
    5
    

    但是整体来说,这样还是很麻烦,bash shell给出了另外一种在脚本中进行数学运算的方法$[]

    ➜  ~ var1=$[1 + 5]
    ➜  ~ echo $var1
    6
    

    该种方法也适用于脚本
    bash shell中还有一个对于算术不友好的表现,就是不支持浮点数,往下看解决办法内建的bash计算器bc

    ➜  ~ bc
    bc 1.06
    Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
    This is free software with ABSOLUTELY NO WARRANTY.
    For details type `warranty'. 
    

    bc实际上是一种编程语言,支持数字(包括浮点数)、变量、注释、表达式、函数等
    退出bc编程模式用quit命令
    在bc中计算浮点数,要通过scale命令设置浮点经度,默认是0,看下面的例子

    ➜  ~ bc -q
    2 / 5
    0
    scale = 4
    2 / 5
    .4000
    

    看到,在没设置scale之前,是不显示小数点后面的值的
    通过重定向在脚本中使用bc
    看下面的例子,写一个脚本:

    #!/bin/bash
      
    var1=$(echo "scale=4;1 + 5"|bc)
    echo 最终结果是:$var1
    

    执行脚本

    ➜  ~ chmod u+x test 
    ➜  ~ ./test  
    最终结果是:6
    

    通过例子看到,可以通过管道,将多个表达式(用;分割)传输给bc执行计算
    但是当表达式多行的时候,放在一条命令中似乎就不太友好了
    可以通过内联重定向解决这个问题,看下面的脚本例子

    #!/bin/bash
      
    var1=11.11
    var2=12
    var3=13
    
    var5=$(bc << eof
    scale = 4
    a1 = ($var1 + $var2)
    a2 = ($var2 + $var3)
    a1 + b1
    eof
    )
    echo 最终结果是:$var5
    

    执行脚本结果

    ➜  ~ ./test  
    最终结果是:23.11
    

    通过换行和标识符,给bc中传入多行表达式
    *注意 bc内的变量不可以在shell脚本中使用

    7.退出脚本

    对于每个执行命令,shell可以通过$?命令查看退出状态

    ➜  ~ date
    2018年 5月29日 星期二 17时53分35秒 CST
    ➜  ~ $?
    zsh: command not found: 0
    

    退出状态实际是一个数字,范围是0~255,有一些基本的参数,但是没有固定的标准
    默认情况下shell脚本会以最后一条命令作为退出状态码
    通过exit命令在脚本中自定义退出状态码,只要在脚本退出的时候自定义一下即可
    *注意 退出状态范围是0~255,超出范围返回的状态码是255取余后的结果

    相关文章

      网友评论

        本文标题:七、构建shell脚本

        本文链接:https://www.haomeiwen.com/subject/eidldxtx.html