zoukankan      html  css  js  c++  java
  • Shell编程—基础脚本

    1. 使用多个命令

    如果要两个命令或者多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。

     

     2. 创建 shell 脚本文件

    例如:

    #!/bin/bash 
    # This script displays the date and who's logged on
    date who

    这就是脚本的所有内容了。可以根据需要,使用分号将两个命令放在一行上,但在shell脚本中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。

     

    3 显示消息

    可以将echo语句添加到shell脚本中任何需要显示额外信息的地方。

    $ vim test1 
    #!/bin/bash
    # This script displays the date and who's logged on
    echo The time and date are:
    date
    echo "Let's see who's logged into the system:"
    who

    当运行这个脚本时,它会产生如下输出:

     

     4. 使用变量

    4.1环境变量

     在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。下面的脚本

    演示了这种用法:

    $ vim test3
    #!/bin/bash
    # testing variables 
    days=10 
    guest="Katie" 
    echo "$guest checked in $days days ago" 
    days=5 
    guest="Jessica" 
    echo "$guest checked in $days days ago"

    输出:

     

     4.2用户变量

    用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。使用等号将值赋给用户变量,在变量、等号和值之间不能出现空格。

    $ vim test3
    #!/bin/bash
    # testing variables 
    days=10 
    guest="Katie" 
    echo "$guest checked in $days days ago" 
    days=5 
    guest="Jessica" 
    echo "$guest checked in $days days ago"

    输出:

     

     4.3命令替换

    shell脚本中,有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。

    有两种方法可以将命令输出赋给变量:

    1. 反引号字符(`)
    2. $()格式

    要注意反引号字符,在美式键盘上,它通常和波浪线(~)位于同一键位。

    使用普通的shell命令输出创建变量的例子:

    $ vim test5 
    #!/bin/bash 
    testing=$(date) 
    echo "The date and time are: " $testing

    变量testing获得了date命令的输出,然后使用echo语句显示出它的值。运行这个shell脚本生成如下输出:

     

     再举一个例子:通过命令替换获得当前日期并用它来生成唯一文件名。

    #!/bin/bash 
    # copy the /usr/bin directory listing to a log file 
    today=$(date +%y%m%d) 
    ls /usr/bin -al > log.$today 

    运行该脚本之后,应该能在目录中看到一个新文件:

    -rw-r--r--    1 user     user          769 Jan 31 10:15 log.191125

     5重定向输入和输出

    重定向可以用于输入,也可以用于输出,可以将文件重定向到命令输入.

    5.1输出重定向

    基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:

    command > outputfile

    5.2输入重定向

    输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的输出重定向到文件。输入重定向符号是小于号(<):

    command < inputfile

    一个简单的记忆方法就是:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。小于号说明数据正在从输入文件流向命令。

    $ wc < test6
     2      11      60

    6管道

    我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令,这个过程叫作管道连接。符号是(|),在美式键盘上,它通常和反斜线()位于同一个键。管道被放在命令之间,将一个命令的输出重定向到另一个命令中:

    command1 | command2

    Linux系统会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。

     

     也可以用一条文本分页命令(例如less或 more)来强行将输出按屏显示。

    $ rpm -qa | sort | more

    7执行数学运算

    7.1expr命令

    expr命令能够识别少数的数学和字符串操作符:

    操 作 符

    描  述

    ARG1 | ARG2

    如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2

    ARG1 & ARG2

    如果没有参数是null或零值,返回ARG1;否则返回0

    ARG1 < ARG2

    如果ARG1小于ARG2,返回1;否则返回0

    ARG1 <= ARG2

    如果ARG1小于或等于ARG2,返回1;否则返回0

    ARG1 = ARG2

    如果ARG1等于ARG2,返回1;否则返回0

    ARG1 != ARG2

    如果ARG1不等于ARG2,返回1;否则返回0

    ARG1 >= ARG2

    如果ARG1大于或等于ARG2,返回1;否则返回0

    ARG1 > ARG2

    如果ARG1大于ARG2,返回1;否则返回0

    ARG1 + ARG2

    返回ARG1和ARG2的算术运算和

    ARG1 - ARG2

    返回ARG1和ARG2的算术运算差

    ARG1 * ARG2

    返回ARG1和ARG2的算术乘积

    ARG1 / ARG2

    返回ARG1被ARG2除的算术商

    ARG1 % ARG2

    返回ARG1被ARG2除的算术余数

    STRING : REGEXP

    如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

    match STRING REGEXP

    如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

    substr STRING POS LENGTH

    返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串

    index STRING CHARS

    返回在STRING中找到CHARS字符串的位置;否则,返回0

    length STRING

    返回字符串STRING的数值长度

    + TOKEN

    将TOKEN解释成字符串,即使是个关键字

    (EXPRESSION)

    返回EXPRESSION的值


     7.2使用方括号

    $ vim test7 
    #!/bin/bash 
    var1=100 
    var2=50 
    var3=45 
    var4=$[$var1 * ($var2 - $var3)] 
    echo The final result is $var4

    输出:

     

     7.3 浮点解决方案

    1. bc的基本用法

    bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式后返回结果。bash计算器能够识别:

    • 数字(整数和浮点数)
    • 变量(简单变量和数组)
    • 注释(以#或C语言中的/* */开始的行)
    • 表达式
    • 编程语句(例如if-then语句)

    函数可以在shell提示符下通过bc命令访问bash计算器:

     

     浮点运算是由内建变量scale控制的。必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果:

     

     除了普通数字,bash计算器还能支持变量:

     

     变量一旦被定义,你就可以在整个bash计算器会话中使用该变量了。print语句允许你打印变量和数字。

    2. 在脚本中使用bc

    基本格式如下:

    variable=$(echo "options; expression" | bc)

    第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。expression参数定义了通过bc执行的数学表达式。这里有个在脚本中这么做的例子:

    $ vim test10 
    #!/bin/bash 
    var1=100 
    var2=45 
    var3=$(echo "scale=4; $var1 / $var2" | bc) 
    echo The answer for this is $var3

    输出:

     

    8退出脚本

    shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。

    状 态 码

    描  述

    0

    命令成功结束

    1

    一般性未知错误

    2

    不适合的shell命令

    126

    命令不可执行

    127

    没找到命令

    128

    无效的退出参数

    128+x

    与Linux信号x相关的严重错误

    130

    通过Ctrl+C终止的命令

    255

    正常范围之外的退出状态码

    查看状态码:

    $ date 
    Sat Jan 15 10:01:30 EDT 2014 
    $ echo $? 
    0

    exit命令允许你在脚本结束时指定一个退出状态码:

    $ cat test13
    #!/bin/bash
    # testing the exit status 
    var1=10
    var2=30 
    var3=$[$var1 + $var2] 
    echo The answer is $var3 
    exit 5

    当查看脚本的退出码时,你会得到作为参数传给exit命令的值:

     

     特别注意,退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。所以最终的结果是指定的数值除以256后得到的余数。比如指定的状态码值是300,那么最终的状态退出码是44(300%256=44)。

  • 相关阅读:
    (转)五大常用算法之二:动态规划算法
    (转)五大常用算法之一:分治算法
    dict
    usaco2
    usaco3
    usaco4
    usaco1
    并查集
    洛谷P1428小鱼比可爱
    洛谷P1967货车运输
  • 原文地址:https://www.cnblogs.com/ericz2j/p/12045503.html
Copyright © 2011-2022 走看看