脚本的基本编译

  从本节开始,正式进入shell脚本编辑。shell

一、使用多条命令

  若是想使用两条命令同时运行,可使用 分号 隔开来执行;express

  例如:date ; who编程

  注意,这种方式下面,单条命令的最大字符数量不能超过255个字符;数组

二、建立脚本文件

#!/bin/bash  

  #在普通的shell脚本中,# 符号做为注释行,默认shell脚本不处理注释行,可是第一行例外。这一行用来告诉系统,如下均为shell程序命令;bash

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

  在shell脚本中,程序执行都是按照顺序由上至下的进行运行的;函数

  若是想执行这个脚本程序,能够将文件添加到PATH路径中,或是使用全路径来执行这个脚本程序;ui

  第二种执行方式:this

chmod u+x test1
./test1

三、显示消息

  大多数的shell命令生成本身的输出,这些输出在运行该脚本的控制台监视器上输出相应的信息,来帮助客户知道发生了什么事情;spa

#!/bin/bash
#This script displays the date and who's logged on
echo The time adn date are;
date
echo "Let's see who's logged into the system:"
who
chmod u+x test1
./test1

  echo命令再输出内容的时候默认在最后输出一个回车,此时,为了让结果和文本字符串在同一行显示,咱们使用 -n 参数来实现3d

echo -n "The time and date are:"

  输出结果以下:

四、使用变量

  在shell脚本中,咱们不是仅仅只处理命令,还须要加入变量,结合数据来实现对应的功能;

  4.一、环境变量

    首先,在shell脚本中就能够应用对应环境变量,经过set命令就能够查看到;

#!/bin/bash
#display user information from the system
echo “User info for userid:$USER”
echo UID: $UID
echo HOME: $HOME
chmod u+x test2
./test2

    这样的话,就会显示当前用户的UID和HOME目录;

    在shell脚本程序中,若是你须要使用符号自己的含义,是须要使用  \  反斜线来还原符号自己的含义的

echo "The cost of th item is \$15"

  4.二、用户变量

    除了系统自带的环境变量,在shell脚本程序中,Linux系统是支持使用本身的定义的本地变量的;也就是用户变量;

    可是要注意,用户变脸的字符不能操做20个字符字母、数字或者下划线。变量名称是区分大小写的Var1和var1是不同的。而且经过等号,来给变量赋值;

var1=10
var2=-57
var3=testing
var="still more testing"

    用户变量再shell脚本周期内生效,若是shell脚本执行结束,这个变量也随之被删除;

#!/bin/bash
#testing variables
days=10
guest="Katie"
echo "$guset checked in $days days ago"
days=5
guset="Jessica"
echo "$guset checked in $days days ago"
chmod u+x test3
./test3

    脚本由上向下执行,变量从新复制都会覆盖掉以前全部的值;

#!/bin/bash
#assigning a variable value to another variable
value1=10
value2=$value1
echo The resulting value is $value2
chmod u+x test4
./test4

    其中$value1值赋给value2的时候必须加上 $ 符号

  4.三、反引号

    反引号所引发来的内容,若是是命令,则会将命令的执行结果取出来,并赋值给对应的变量;

#!/bin/bash
#using the backtick character
testing=`date`echo "The date and time are:" $testing
chmod u+x test5
./test5

    此时,输出的就是date这个内容,就是执行date命令所看到的内容

#!/bin/bash
# copy th /usr/bin directory listing to a log file
today=`date +%y%m%d`
ls /usr/bin -al > log.$today
chmod u+x test6
./test6

    这样就将ls /usr/bin -al 查看到的内容,复制给对应的目录,且这个目录后缀为今天的时间,这个操做在真实的工做环境下是常用的;

五、重定向输入输出

  有时候,咱们想保存命令的输出,而不是显示出来。bash shell提供了几种操做符来实现;

  5.一、输出重定向

    command > outputfile

date > test6
ls -l test6
cat test6
who > test6
cat test6

    若是是追加文件的话,咱们就须要使用 >>

date >> test6
cat test6

  5.二、输入重定向

    command < inputfile  它主要是将一个文件的内容重定向到一条命令中去;

wc < test6  #将test6这个文件交给wc来执行

    wc命令:在wc命令下生成的三个值

      文本的行数

      文本的单词书

      文本的字节数

    内置输入重定向符号为两个小于号 <<;咱们须要指定一个文本标记来讲明数据输入的开始和结尾。文本标记可使用任意字符,可是开始和结尾必须相同

wc << EOF
>test string 1
>test string 2
>test string 3
> EOF

六、管道

  command1 | command2  #将command1命令的结果输出给command2来执行;

rpm -qa | sort | more
rpm -qa | sort > rpm.list  #查看安装的全部软件,同时进行排序,并将结果输入到rmp.list文件中

七、数学计算

   在shell脚本程序中,使用数学运算是必须的;

  7.一、expr 命令

    能够经过expr来进行数学运算

expr 1+5

    expr命令可以区分一些不一样的数学操做符合字符串的操做符,以下表:

expr 5 \* 2  #对于有些符号,具备特定意义的,须要使用反斜线,恢复其自己意思;
#!/bin/bash
# An example of using the expr command
var1=10
var2=20
var3='expr $var2 / $var1'
echo The result is $var3
chmod u+x test6
./test6 

  7.二、使用括号

    ($[operation])

var1=$[1 + 5]
echo $var1
var2=$[$var1 * 2]
echo $var2

    与使用expr命令相比,使用括号使用shell数学运算变的更加简单。

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

    使用括号的方式来进行算数运算,无需小心符号错误;

#!/bin/bash
var1=100
var2=45
var3=$[$var1 / $var2]
echo The final result is $var3
chmod u+x test8
./test8

    上面运行脚本的结果为2,是一个整形,这里属于数据类型的结果,正确状况下须要回复一个浮点数据才是正确的;

  7.三、浮点解决方案

    解决浮点运算问题最简单的方式就是使用bc计算器;

    一、bc的基础知识

    bash计算器能够识别的数据类型:一、数字(包括整数和浮点);二、变量(简单变量和数组);三、注释(以英镑符号开始的行或者C育婴的/* */对);四、表达式;五、编程语句(如if-then语句);六、函数;

bc
12 * t.4
3.156 * (3 + 5)
quit

    scale参数控制浮点计算后支持几位数值:

bc -q
3.44 / 5
scale=4
3.44 / 5

    或者则会像是小数点后4为,这就是经过scale参数来控制的;

    同时,在bc计算器中,也可使用变量来进行匀速昂;

bc -q
var1=10
var1 * 4
var2 = var1 / 5
print var2
quit

    二、在脚本中使用bc

    在shell脚本中使用bc计算器,来进行浮点计算;

    用法:variable=`echo "options; expression" | bc`

#!/bin/bash
var1=`echo " scale=4; 3.44 / 5" | bc`
echo The answer is $var1
chmod u+x test9
./test9

    为了避免再受到数字的限制,咱们使用变量来实现运算

#!/bin/bash
var1=100
var2=45
var3=`echo "scale=4; $var1 / $var2" | bc`
echo The answer for this is $var3
chmod u+x test10
./test10

    固然,若是继续赋值了的话,能够再给其余的运行式进行运算

#!/bin/bash
var1=20
var2=3.14159
var3=`echo "scale=4; $var1 * $var2" | bc`
var4=`echo "scale=4; $var3 * $var2" | bc`
echo The final result is $var4

    对于简短的计算这种方法很好,可是有时数字多了,就会显示的很混乱;

    这个问题有个简单的解决方法。bc命令可以是被输入重定向,允许把文件重定向到bc命令中进行处理。然而,这一样容易混淆,由于须要在文件中存储表达式;

    还可使用内置输入重定向的方式,而不是用文件重定向。在shell中,能够把输出赋值给变量。以下:

variable=`bc << EOF 
options 
statements 
expressions 
EOF 
`

    EOF文本字符串代表内置重定向数据的开始和末尾。记住任然须要使用反引号将bc命令输出的值赋给变量。

    如今能够把全部单独的bash计算器元素放到脚本的单独行中。

#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71

var5=`bc << EOF
scale = 4
a1 = ( $var1 + $var2 )
b1 = ( $var3 * $var4 )
a1 + b1
EOF
`
echo The final answer for this mess is $var5

八、退出脚本

  shell脚本中的命令都是使用一个退出状态。这个退出状态介于0和255之间的整数值,当命令运行完成使,命令就会把退出状态传递给shell。能够捕捉这个值并在您的脚本中使用它。

  8.一、核对退出状态

    $?  特殊变量输出最后一条命令执行的转态。若是向核对上一条命令的执行状态,须要在这条命令后直接 echo $?;

date
echo $?

    若果是错误的状态,则会放回非0的结果

afdas
echo $?

    常见的返回状态:

      0  #命令执行成功

      1  #未知的错误

      2  #误用shell命令

      126  #命令没法执行

      127  #没有找到命令

      128  #无效的退出参数

      128+x  #使用Linux信号x的致命错误

      130  #使用ctrl+c终止的命令

      255  #规范外的退出转态

~]#./myprog.c
-bash: ./myprog.c:Permission denied
~]#echo $?
126
~]#date %t
date: invalid date '%t'
~]#echo $?
1

  8.二、退出命令

    指定一个脚本的退出状态

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

    这样的话,去检查脚本的退出状态码就不是默认的0了,而是最后咱们指定的5;

    同时退出转态码,也可使用变量

#!/bin/bash
#testing the exit status
var1=10
var2=30
var3=$[ $var1 + $var2 ]
exit $var3

    这样,退回的转态码就是$var3的值;

    应该谨慎使用退出状态码,由于退出状态码最高是255。若是超出这个范围,运算结果就是那个特定的书被256除了以后的余数。

    在if-then语句中,退出状态码尤为重要;

相关文章
相关标签/搜索