当前位置: 澳门新濠3559 > 操作系统 > 正文

Shell可以让你将多个命令串起来,脚本文件

时间:2019-12-08 05:50来源:操作系统
Shellscript(Shell脚本)的工作方式有两种: Shell script学习总结 11.1使用多个命令 $date;who   //  命令列表,加入分号就可以,这样会依次执行。参见5.2.1节 注意区分$(date;who),这个是进程

Shell script(Shell脚本)的工作方式有两种:

Shell script学习总结

11.1使用多个命令

$date;who   //  命令列表,加入分号就可以,这样会依次执行。参见5.2.1节

注意区分$(date;who),这个是进程列表,会生成一个子shell来执行

Shell脚本的关键在于输入多个命令并处理每个命令的结果,甚至需要将一个命令的结果传给另外一个命令。

Shell可以让你将多个命令串起来,一次性完成。

 

上面的date;who可以写入一个文件,这样就不用在命令行敲命令了,运行这个文本文件就好了。

 

①交互式(Interactive):用户每输入一条命令,然后Shell立即执行一次;

shell script注意事项

  1. 命令的执行顺序 从上至下,从左至右
  2. 命令的执行:命令,参数间的多个空白都会被忽略掉
  3. 空白行也将被忽略掉,并且[tab]键所得的空白被同样视为空格键。
  4. 如果一行内容太多可以用“[Enter]”来扩展到下一行。
  5. “#”之后的语句是注释语句。执行时将被忽略。

11.2 创建shell脚本文件

第一行必须这样:指定要使用的shell

#!/bin/bash

 

1.一般情况#用来注释的,但是第一行的#除外

比如写一个test,内容如下:

#!/bin/bash

date

who

 

如果想直接运行,需要将路径添加到PATH环境变量中去。

也可以当前目录直接./test,这样可能会没有权限。

chmod u+x test   //  增加执行权限

接着就可以  ./test 运行了

 

②批处理(Batch):由用户实现编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。

Shell script的执行

假设我们有一个/home/doris/shell.sh脚本文件,执行该脚本文件的方法有如下几种:

  1. 直接命令执行, shell.sh必须有具备可读与可执行(rx)权限,然后:
    • 绝对路径执行:/home/doris/shell.sh
    • 相对路径执行:当前工作目录在/home/doris,则命令为 ./shell.sh
    • 变量"PATH"功能,将shell.sh放置在PATH指定的目录内,例如: ~/bin/.
  2. 以bash进程来执行(此时shell.sh只需要有r权限即可):通过"bash shell.sh"或"sh shell.sh"来执行,记住用这个方式来执行的时候要先进入到该文件所在目录中。
  3. source shell.sh也可以用来执行shell.sh文件,与"sh shell.sh"区别在于source执行的bash进程就是父进程,而bash是在子进程中执行,在子进程中执行的命令的变量不会作用于主进程,只在子进程中起作用。

11.3 显示消息

想在脚本上加提示信息,可以直接这样:

#!/bin/bash

echo  haha,I am xiaochongyong, data print:

date

echo  “Let’s see who’s logged:”

who

 

如果想要输出单引号,需要加双引号把整句话括起来,否则会不正常。比如:

 澳门新濠3559 1

 

还可以这样:

 澳门新濠3559 2

 

echo命令可以用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,需要在文本中使用一种引号,而用另外一种来将字符串划定起来

 

把文本字符串和 命令输出显示在同一行中。用 –n 参数:

#!/bin/bash

echo  –n  “The time and date are: ”

date

 

   

shell追踪与调试

在用sh执行shell脚本的时候可以对执行追踪与调试。
命令如下:

sh [-nvx] shell.sh
参数:
-n: 不需要执行shell.sh,仅仅查询语法的问题。
-v: 在执行script前,先将script的内容输出到屏幕上。
-x: 将使用到的script内容显示在屏幕上,可以跟踪每一个执行的命令。

在这个命令中,-x是一个非常有用的参数,可以帮助我们查看sh执行的过程,快速定位错误在那里。

11.4 使用变量

通常会需要在shell命令使用其他数据来处理信息,可以通过变量来实现。

变量允许你临时性的将信息存储在shell中,以便和脚本中的其他命令一起使用

查看系统可用的shell(/etc/shells文件)

Shell script 语法

  • 编写shell script程序的结构:

    1. 每一个shell文件第一行必须有类似#!/bin/bash用来申明使用什么shell来执行,而这里我们是用bash来执行shell。
    2. 程序说明用#来注释对这个文件的说明。
    3. 主要环境变量的说明,一般用来定义PATH变量。(用set -可以用来查看当前设置的环境变量)。比较重要的环境变量还有LANG与文件编码有关,有时候得到的结果与预期的不一样的时候,你可以先检查一下编码是否和你的预期的一样。
    4. 主要程序部分,命令的集合。
  • test命令
    1 "文件类型"判断
    test xxx filename

       参数      意义
       -e    该文件是否存在
       -f    该文件是否存在且为文件
       -d    该文件是否存在且为目录
       -b    该文件是否存在且为一个block device 设备
       -L    该文件是否存在且为一个连接文件
       -c    该文件是否存在且为一个character device设备
       -S    该文件是否存在且为一个Socket文件
       -p    该文件是否存在且为一个FIFO(pipe)文件
    

    2 文件权限检测
    test xxx filename

      参数   意义
      -r   该文件是否存在且具有可读权限
      -x   该文件是否存在且具有可执行权限
      -w   该文件是否存在且具有可写权限
      -s   该文件是否存在且为"非空白文件" 
    

    3 两个文件之间的比较
    test file1 xx file2

    参数  意义
    -nt (newer than)判断file1是否比file2新
    -ot (older than)判断file1是否比file2旧
    -ef 判断两个文件是否是同一个文件,主要在于判断两个文件是否指向同一个文件结点
    

    4 两个整数之间的判断
    test n1 xx n2

    参数  意义
    -eq n1是否等于n2(equal)
    -ne 不相等
    -gt n1大于n2
    -lt n1小于n2
    -ge n1大于等于n2    
    

    5 字符串判断

    Test -Z string 判断字符串是否为0,字符串为空字符串,返回为true。
    Test -n string 判断字符串是否非空,字符串非空时,返回true。
    test str1=str2 判断两字符串是否相等
    test str1!=str2 判断两字符串不相等

    6 多重条件判断连接符
    -a and
    -o or
    ! 非

    PS:
    1 除了用test命令之外,可以用[]判断符号,比如[ -z "$home" ]判断$home是否为空。还有一个需要注意的是,因为[]使用的地方很多,所以在作为判断符号的时候,中括号的两端需要空格键分隔。

  • 中括号内的每个组件都需要空格键来分隔

  • 中括号中的变量最好都以双引号括起来

  • 中括号中的常量最好都用单引号与双引号括起来
    原因如下:
    name="doris's jianshu"
    [ $name == "doris's jianshu" ]
    执行之后你会发现报错: too many arguments
    为什么呢? 分析一下原因:展开上述判断式为[ doris's jianshu = "doris's jianshu"]这样就有'doris's','jianshu'以及'doris's jianshu'三个参数,而判断式仅能两个数据比较。所以就报错了。所以应该加上双引号,变成[ "doris's jianshu" == "doris's jianshu"].

2 在bash当中===是一样的,不过一般用=表示变量的设置,==用于逻辑判断。

  • shift 用于参数变量号码偏移, shift 3表示参数偏移3个,从第四个开始取。

  • 默认变量,在shell script存在默认变量名,比如下面这个命令:

    /home/doris/shell.sh 1, 2, 3
    $0 $1 $2 $3
    其中参数1,默认变量名为$1,所以在shell文件中可以利用$1来代表第一个参数,从而对它操作。

11.4.1 环境变量

Shell维护着一组环境变量用来记录特定的系统信息。比如系统的名字,登录到系统的用户,UID等。

可以用set命令来显示一份完整的当前环境变量列表。

 

在脚本中可以在环境变量前加上美元符$来使用环境变量。

#!/bin/bash

# display Info

echo "User info for userid: $USER"

echo UID: $UID

echo HOME: $HOME

 

 

echo “The cost of the item is $15”

这样输出不了$,脚本会尝试显示$1的值,再显示5。应该在前面防止一个反斜杠

echo “The cost of the item is $15”

 

允许脚本将美元符解读为实际的美元符

 

澳门新濠3559 3

条件判断式

1 if[];...then...fi
2 if[];...then..elif[];..then...else..fi
3 当变量是固定值的时候,可以使用case判断式,如果有学习过JAVA的,其实就相当于switch语句。
case $变量名称 in
"第一个变量内容")
;;
"第二个变量内容")
;;
*)//其他变量
;;
esac

11.4.2 用户变量

Shell脚本还允许在脚本中定义和使用自己的变量。

定义变量允许临时存储数据并在脚本中使用,这样看起来更像是一个程序了。

用户变量可以是任何字母数字或下划线组成的文本字符串,长度不超过20个。区分大小写

使用=给用户变量赋值,变量=和值之间不能有空格

比如:

var=10

Var=2

Var3=testing

Var4=”hahaha”

 

Shell脚本会自动决定变量值的数据类型,在脚本整个生命周期里变量会一直保持它们的值,直到结束时会被删除掉。

也是用美元符引用。

 

也可以用变量对变量进行赋值,比如:

 

#!/bin/bash

age=22

name="xiaochongyong"

echo "Hi, i am $name, age $age"

echo "copy test2:"

age1=$age

name1=$name

echo "Hi, copy test i am $name1, age $age1"

 

Linux系统默认的命令行终端解释器为Bash

循环(loop)

1 while [condition] 当condition不成立时才停止。
do
程序段落
done

2 until [condition] 当condition成立时才停止与while do done相反。
do
程序段落
done
3 for var in con1,con2,con3 依次读取con1,con2,con3执行程序段落
do
程序段落
done
4 for ( ( 初始值1; 限制值; 执行步长) )
do
程序段落
done

11.4.3 命令替换

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

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

(1)反引用字符(` `)。美式键盘上在波浪线~同一个键位

(2)$() 格式:

#!/bin/bash

testing=`date`

echo -n "date  is: $testing"

echo ""

testing2=$(date)

echo -n "date2 is: $testing2"

echo ""

 

下面这个就有意思了:

#!/bin/bash

# copy the /usr/bin directory listing to a log file

today=$(date +%y%m%d)

ls /usr/bin -al > log.$today

 

today是被赋予格式化之后的date命令的输出,这是提取日期信息来生成日志文件名常用的一种技术。  

+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合

ls /usr/bin -al > log.$today   这里就重定向到一个文件中了。

 注意:

命令替换会创建一个子shell来运行对应的命令。子shell所执行命令是无法使用脚本中所创建的变量的。

在命令行提示符下使用路径./也会创建出子shell。  比如:test3脚本中  ./test2 

要是运行命令的时候不加入路径,就不会创建子shell。

如果使用的是内建shell命令就不会涉及子shell。

 

澳门新濠3559 4

11.5 重定向输入和输出

   

11.5.1输出重定向

将命令的内容重定向到文件

Command > outfile

比如:who > test6  不存在则创建,存在则覆盖

pwd >> test6  这样会追加

 

Shell脚本文件的格式:

11.5.2 输入重定向

1.将文件的内容重定向到命令

小于号  <

wc命令可以对数据中的文本进行计数。

默认会输出文本的行数,文本的词数,文本的字节数

比如:

wc < test6

 澳门新濠3559 5

2.内联输入重定向:无需使用文件进行重定向,只需要在命令行中指定用户输入重定向的数据就可以了。

符号:  <<

还需要指定一个文本标记来划分输入数据的开始和结尾,任何字符串都可以作为文本标记,但在数据的开始和结尾文本标记必须一致。

 澳门新濠3559 6

比如这样,输入xcy表示结束。Wc命令对内联输入重定向提供的数据进行行、词、字节数的计数,直到输入了作为文本标记的那个字符串。

 

  1. 第一行(一般必须写明):指定脚本使用的shell(若不写明也不影响脚本的执行,系统会自动以sh解析脚本)。"#!/bin/bash"声明文件内的语法使用bash的语法,当这个程序被执行时,加载bash的相关环境配置文件(一般是non-login shell中的~/.bashrc文件)。
  2. 第二部分的注释(可写):程序内容的说明。shell脚本中,井号#用作批注(除第一行的"#!"外),shell不会解释以#开头的行(除第一行bash声明外)。

  3. 主要环境变量的声明(可写)

  4. 脚本的程序部分。

  5. 程序执行结束,回传一个数值给系统告知执行的结果(可写。默认命令执行成功返回数值0)。

11.6 管道

可以将一个命令的输出作为另一个命令的输入。可以用重定向来实现,也可以用管道。

 

管道连接(piping):直接将命令输出重定向到另一个命令中。

格式:  command1 | command2

这两个命令不是依次执行的,而是同时运行的,在内部将它们连接起来。

可以在一条命令中使用多条管道,可以持续的将命令的输出通过管道传给其他命令来细化操作。

 

注意:管道与重定向的区别

(1) | 左边的命令应该有标准输出,右边应该接受标准输入

(2)重定向, > 右边只能是文件,  左边命令要有标准输出

  <  左边能接受标准输入,右边只能是文件(文件好像有点不合理)

(3)重定向是在一个进程内执行的,管道触发两个子进程执行|两边的程序

 

例子:

$cat test2 | grep –n ‘echo’   // 左边输出,右边接受输入,查找包含 grep的行

$grep –n ‘echo’ < test  // 效果更上面类似

 

下面是网上别人的:

Linux Shell常用技巧(十) 管道组合

二十. 通过管道组合Shell命令获取系统运行数据:

    1.  输出当前系统中占用内存最多的5条命令:

    #1) 通过ps命令列出当前主机正在运行的所有进程。

    #2) 按照第五个字段基于数值的形式进行正常排序(由小到大)。

    #3) 仅显示最后5条输出。

    /> ps aux | sort -k 5n | tail -5

    stephen   1861  0.2  2.0  96972 21596  ?  S     Nov11   2:24 nautilus

    stephen   1892  0.0  0.4 102108  4508  ?  S<sl Nov11   0:00 /usr/bin/pulseaudio

    stephen   1874  0.0  0.9 107648 10124 ?  S     Nov11   0:00 gnome-volume

    stephen   1855  0.0  1.2 123776 13112 ?  Sl     Nov11   0:00 metacity

    stephen   1831  0.0  0.9 125432  9768  ?  Ssl   Nov11   0:05 /usr/libexec/gnome

   

    2.  找出cpu利用率高的20个进程:

    #1) 通过ps命令输出所有进程的数据,-o选项后面的字段列表列出了结果中需要包含的数据列。

    #2) 将ps输出的Title行去掉,grep -v PID表示不包含PID的行。

    #3) 基于第一个域字段排序,即pcpu。n表示以数值的形式排序。

    #4) 输出按cpu使用率排序后的最后20行,即占用率最高的20行。

    /> ps -e -o pcpu,pid,user,sgi_p,cmd | grep -v PID | sort -k 1n | tail -20

 

    3.  获取当前系统物理内存的总大小:

    #1) 以兆(MB)为单位输出系统当前的内存使用状况。

    #2) 通过grep定位到Mem行,该行是以操作系统为视角统计数据的。

    #3) 通过awk打印出该行的第二列,即total列。

    /> free -m | grep "Mem" | awk '{print $2, "MB"}'

    1007 MB

   

1.  获取当前或指定目录下子目录所占用的磁盘空间,并将结果按照从大到小的顺序输出:

    #1) 输出/usr的子目录所占用的磁盘空间。

    #2) 以数值的方式倒排后输出。

    /> du -s /usr/* | sort -nr

    1443980 /usr/share

    793260   /usr/lib

    217584   /usr/bin

    128624   /usr/include

    60748    /usr/libexec

    45148    /usr/src

    21096    /usr/sbin

澳门新濠3559,    6896      /usr/local

    4           /usr/games

    4           /usr/etc

    0           /usr/tmp

   

    2.  批量修改文件名:

    #1) find命令找到文件名扩展名为.output的文件。

    #2) sed命令中的-e选项表示流编辑动作有多次,第一次是将找到的文件名中相对路径前缀部分去掉,如./aa改为aa。

    #    流编辑的第二部分,是将20110311替换为mv & 20110310,其中&表示s命令的被替换部分,这里即源文件名。

    #    1表示被替换部分中#的(.*)。

    #3) 此时的输出应为

    #    mv 20110311.output 20110310.output

    #    mv 20110311abc.output 20110310abc.output

    #    最后将上面的输出作为命令交给bash命令去执行,从而将所有20110311*.output改为20110311*.output

    /> find ./ -name "*.output" -print  | sed -e 's/.///g' -e 's/20110311(.*)/mv & 201103101/g' | bash

   

    3.  统计当前目录下文件和目录的数量:

    #1) ls -l命令列出文件和目录的详细信息。

    #2) ls -l输出的详细列表中的第一个域字段是文件或目录的权限属性部分,如果权限属性部分的第一个字符为d,

    #    该文件为目录,如果是-,该文件为普通文件。

    #3) 通过wc计算grep过滤后的行数。

    /> ls -l * | grep "^-" | wc -l

    /> ls -l * | grep "^d" | wc -l

   

    4.  杀掉指定终端的所有进程:

    #1) 通过ps命令输出终端为pts/1的所有进程。

    #2) 将ps的输出传给grep,grep将过滤掉ps输出的Title部分,-v PID表示不包含PID的行。

    #3) awk打印输出grep查找结果的第一个字段,即pid字段。

    #4) 上面的三个组合命令是在反引号内被执行的,并将执行的结果赋值给数组变量${K}。

    #5) kill方法将杀掉数组${K}包含的pid。

    /> kill -9 ${K}=`ps -t pts/1 | grep -v PID | awk '{print $1}'`   

 

    5.  将查找到的文件打包并copy到指定目录:

    #1) 通过find找到当前目录下(包含所有子目录)的所有*.txt文件。

    #2) tar命令将find找到的结果压缩成test.tar压缩包文件。

    #3) 如果&&左侧括号内的命令正常完成,则可以执行&&右侧的shell命令了。

    #4) 将生成后的test.tar文件copy到/home/.目录下。

    /> (find . -name "*.txt" | xargs tar -cvf test.tar) && cp -f test.tar /home/.

   

    #1) cpio从find的结果中读取文件名,将其打包压缩后发送到./dest/dir(目标目录)。

    #2) cpio的选项介绍:

    #    -d:创建需要的目录。

    #    -a:重置源文件的访问时间。

    #    -m:保护新文件的修改时间。

    #    -p:将cpio设置为copy pass-through模式。

    /> find . -name "*" | cpio -dampv ./dest/dir

澳门新濠3559 7

11.7 执行数学运算

有两种途径:

脚本文件test1.sh的执行方式:

11.7.1 expr 命令:允许在命令行上处理数学表达式

对于那些容易被shell错误解释的字符,在它们传入expr命令之前需要使用转义字符将其标出来。

比如:

#!/bin/bash

# expr test:

var1=10

var2=20

var3=$(expr $var2 / $var1)

#var4=$(expr $var2 $var1)   Error,*

var4=$(expr $var2 \ $var1)*

echo The var3 result is $var3

echo The var4 result is $var4

有一个expr命令操作符表可以看一下。

  1. 以sh(bash)进程来执行脚本文件(用户不必拥有对脚本文件的x权限)(在子进程中执行)

    澳门新濠3559 8

    sh -x:实现shell脚本逐条语句的跟踪

    澳门新濠3559 9

    sh -n:不执行脚本,仅进行语法的检查

    澳门新濠3559 10

    sh -v:执行脚本前,先将脚本的内容输出到屏幕上

    澳门新濠3559 11

  2. 通过绝对或相对路径来执行脚本文件(用户须拥有对脚本文件的x权限)

    (Linux系统中一切都是文件。后缀名.sh仅提示用户该文件是一个脚本文件,并不代表该文件是可以被用户执行的。文件是否可以被执行在于用户是否拥有对该文件的x权限)(在子进程中执行)

11.7.2 使用方括号

比expr方便多了。还不同担心乘号或其它符号。

在shell脚本中进行算数运算会有一个主要的限制:只支持整数运算

比如:

#!/bin/bash

# expr test:

var1=10

var2=20

var3=$[$var2 / $var1]

var4=$[$var2 $var1]*

var5=$[$var2 + $var2 $var1]*

echo The var3 result is $var3

echo The var4 result is $var4

echo The var5 result is $var5

![](https://images2018.cnblogs.com/blog/1118205/201803/1118205-20180326172521559-1714248185.png)

11.7.3 浮点解决方案

有几种解决方案,最常见的是用内建的bash计算机,叫做bc

1.bc的基本用法

bash计算机实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算表达式

直接输入bc,进入计算机:

 澳门新濠3559 12

 

Bash计算机设置好scale后就可以显示小数了。

还支持变量

 

2.在脚本中使用bc

可以用命令替换运行bc命令,并将输出赋值给一个变量

格式如下:

Variable=$(echo “options; expression” | bc)

比如:

#!/bin/bash

var=$(echo "scale=4; 13 / 10" | bc)

echo var is $var

var1=300

var2=45

var3=$(echo "scale=4; $var1 / $var2" | bc)

echo var3 is $var3

var4=$(echo "scale=4; $var3 + $var2 2" | bc)*

echo var4 is $var4

 

上面的方法适用于较短的运算,涉及到很多数字时就会有点麻烦。

解决方案:bc命令能识别输入重定向,允许将一个文件重定向到bc命令来处理。最好的方案是使用内联输入重定向,它允许你直接在命令中重定向数据。

Varible=$(bc << EOF

Options

Statements

Expressions

EOF

)

 澳门新濠3559 13

比如:

#!/bin/bash

var1=10

var2=9

var3=8

var4=7

var5=$(bc << EOF

scale = 4

a1 = ($var1 $var2)*

a2 = ($var3 $var4)*

a2 + a1 a1*

a2

EOF

)

echo var4 is $var5

EOF标识了内联重定向数据的起止,记住,仍然需要命令替换符号将bc命令的输出赋给变量

将选项和表达式放在脚本的不同行可以让处理过程变得清晰。

还可以在bash计算机中赋值给变量,在bc计算机中创建的变量只在bc计算机中有效,不能再shell脚本中使用

 

  1. 将脚本文件所处的目录添加到PATH环境变量中,通过输入脚本文件名来直接运行(用户须拥有对脚本文件的x权限)(在子进程中执行)

    澳门新濠3559 14

  2. 通过source命令或小数点(.)来执行脚本文件(在父进程中执行)

    澳门新濠3559 15

    用方式①/②/③执行test2.sh脚本,执行完成后回到命令行模式(父进程)输出脚本中设置的变量,发现变量并不存在

    (通过上述①/②/③方式(bash(sh)、绝对/相对路径或者将路径添加到$PATH中)来运行脚本时,该script会使用一个新的bash环境(子shell、子进程)来执行脚本内的命令。当子进程完成后(脚本执行结束),子进程内的各项变量或操作将会消失而不会传回给父进程中。)

    澳门新濠3559 16

    澳门新濠3559 17

    若通过source命令或小数点(.)来执行脚本,该script会在父进程中执行。因此,父进程拥有脚本内设置的变量、操作等。

11.8 退出脚本

Shell中运行的每个命令都使用退出吗告诉shell它已经运行完毕。

退出码是一个0 – 255的整数值。

![](https://images2018.cnblogs.com/blog/1118205/201803/1118205-20180326172537125-1335296247.png)

![](https://images2018.cnblogs.com/blog/1118205/201803/1118205-20180326172538621-2008609561.png)

11.8.1 查看退出状态码

如何查看:echo &?

惯例是一个成功结束的命令的退出码是0,如果一个命令结束时有错误,退出状态就是正整数。

 

   

11.8.2 exit命令

默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出。

也可以改变这种行为

这么写: exit 5

再在终端中查看一下:

 澳门新濠3559 18

bash shell中的数学运算:在方括号内计算数学公式 [ operation ],结果赋值为result=$[ operation ]。

补充:关于内联重定向

基本形式如下:

command  << delimiter

*  document*

delimiter

作用:将两个delimiter之间的内容(document)作为输入传递给command。

主要用途:用于脚本命令行交互

注意:结尾的delimiter要顶格写,前面不能有字符。

例子1:

#!/bin/bash

cat << EOF

hahaha1

hahaha2

hahaha3

EOF

echo exit code is $?

 

这个不大好理解

 

澳门新濠3559 19

澳门新濠3559 20

   

数学运算浮点解决方案:使用bc命令(bash的内建计算器)。

选项

作用

-q

不显示bc计算器的欢迎信息

输入quit或组合键ctrl+d可退出bc计算器

澳门新濠3559 21

浮点运算是由内建变量scale(数值范围)控制的,须将这个值设置为希望在计算结果中保留的小数位数,默认值为0。

澳门新濠3559 22

在脚本中使用bc命令,通过命令替换$(),将输出结果赋值给一个变量:

基本格式为 variable=$(echo "options; expression" | bc)

澳门新濠3559 23

澳门新濠3559 24

使用内联输入重定向<<,在命令行中重定向数据(特别适用于进行大量运算):

基本格式为 varible=$(bc << EOF

options

statements

expressions

EOF

)

EOF字符串标识了重定向给bc命令的数据的终止。

澳门新濠3559 25

bash计算器中创建的变量只在bash计算器中有效。

澳门新濠3559 26

   

Shell中运行的每个命令都使用退出状态码告诉shell它运行完毕。退出状态码:0-255的整数值,在命令结束运行时由命令传给shell。变量$?用于保存上个已执行命令的退出状态码。退出状态码可配合exit命令使用。

状态码

描述

0

命令成功结束

1

一般性未知错误

2

不适合的shell命令

126

命令不可执行

127

没找到命令

128

无效的退出参数

128+x

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

130

通过ctrl+c终止的命令

255

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

   

Shell script的的默认变量(接受用户参数的变量)

  • $0:当前Shell脚本程序的名称;
  • $#:参数的个数;
  • $*:所有位置的参数值;
  • $?:上一条命令的执行返回值;
  • $1、$2、$3……:第N个位置的参数值。

澳门新濠3559 27

澳门新濠3559 28

澳门新濠3559 29

   

test(测试):判断条件表达式是够成立。格式:test [参数]。单独执行test命令后不会显示任何信息。

可通过echo $?输出上一条命令(test命令)执行后的返回结果,若为0则表示执行(判断)成功

澳门新濠3559 30

或通过&&、||来显示相关结果

澳门新濠3559 31

  • 文件测试所用的参数

操作符

作用

-e file1

测试file1文件是否存在(exist)

-d file1

测试file1文件是否为目录类型,且是否存在(directory)

-f file1

测试file1文件是否为一般文件,且是否存在(file)

-r file1

测试当前用户对file1文件是否有读取权限(read)

-w file1

测试当前用户对file1文件是否有写入权限(write)

-x file1

测试当前用户对file1文件是否有执行权限(execute)

file1-nt file2

测试file1是否比file2新(newer than)(检查文件日期)

file1-ot file2

测试file1是否比file2旧(older than)

  • 整数测试所用的参数

操作符

作用

n1 -eq n2

检查n1是否等于n2(equal)

n2 -ne n2

检查n1是否不等于n2(not equal)

n1-gt n2

检查n1是否大于n2(greater than)

n1 -lt n2

检查n1是否小于n2(less than)

n1 -le n2

检查n1是否等于或小于n2(less equal)

n1 -ge n2

检查n1是否大于或等于n2(greater equal)

Shell中不应使用"=="和"!="进行整数的比较(会将整数当作字符串来比较)

来自 <>

  • 字符串测试所用的参数

操作符

作用

str1 == str2

比较str1与str2字符串的内容是否相同

str1 != str2

比较str1与str2字符串的内容是否不同

-z str1

判断str1字符串长度是否为0(或未被定义)

-n str1

判断str1字符串长度是否为非0

str1 > str2

判断str1是否比str2大(逐位比较字符串的每个字符,按字典顺序比较大小)

str1 < str2

判断str1是否比str2小

(使用>、<(大于号、小于号)进行判断时必须搭配转义字符/使用,否则shell会误认为是重定向符号,把后字符串误当成文件名)(比较字符串顺序大小的测试中,大写字母会被认为是小于小写字母的(与sort命令恰恰相反,在英语环境下sort命令会认为大写字母是大于小写字母的,即排序结果中小写字母优先于大写字母出现))

澳门新濠3559 32

澳门新濠3559 33

澳门新濠3559 34

  • 多重条件判断

操作符

作用

test1 -a test2

类似于&&,两个测试条件同时成立时才回传true(and)

test1 -o test2

类似于||,任一测试条件成立就回传true(or)

! test1

反向状态(取反)

 

[](中括号):判断符号。bash shell提供的另一种条件测试方法,作用同等与test命令,常用于if…then条件判断式中。

  • 中括号的两端、每个组件间都需要有空格符来分隔。
![](https://images2018.cnblogs.com/blog/1118205/201803/1118205-20180326172602060-1819539279.png)
  • 中括号内的变量、常量,最好都以双引号或单引号括起来。

    澳门新濠3559 35

[ "$yn" == "Y" -o "$yn" == "y" ] 也可写成 [ "$yn" == "Y" ] || [ "$yn" == "y" ] (布尔逻辑能将可能的返回值简化为TRUE或FALSE类型)

澳门新濠3559 36

澳门新濠3559 37

编辑:操作系统 本文来源:Shell可以让你将多个命令串起来,脚本文件

关键词: