当前位置: 必赢官网 > 操作系统 > 正文

《Linux命令行与shell脚本编程大全》第十一章 构建

时间:2019-12-08 06:44来源:操作系统
1.基本命令 touch 创立空文件(当然,你也得以动用echo filename卡塔尔 ln 创立链接符号(神速格局|援用): 标记链接:ln –s 硬链接:ln   区别: 标记链接发生了一个快捷格局,是对源文件

1.基本命令

touch 创立空文件(当然,你也得以动用echo >filename卡塔尔

ln 创立链接符号(神速格局|援用):

  1. 标记链接:ln –s
  2. 硬链接:ln

 

区别:

  1. 标记链接发生了一个快捷格局,是对源文件的叁个链接。
  2. 硬链接是底层字节的链接,总的来说,相当于是二个文件,多少个文件名,占用相像块扇区,好处是省空间,固然删除贰个,只要还应该有硬连接,这一个文件就依然留存。

ls –i 查看文件inode编号(唯生机勃勃的,能够确定文件是还是不是为同三个,相符于hash值)

mv 移动|重命名

file 查看文件(文件夹)类型等消息

cat 呈现内容 -n:全体行号 ;-b:有字加行号;-T:不展现制表符;

more 按页展现;比如:cat xxx |more

tail 查看文件结尾;-n number(或-number):钦赐最终几行;-f:追踪,能够动态追踪日志文件。

head 与tail相近,可是并未-f参数

ps 进程

top 显示linux进度(Linux版职责微处理器)

kill 干掉进程

df 查看硬盘空间

sort 文件内容排序

grep 寻觅文本

$BASH_SUBSHELL 子shell检查评定变量

sleep timeCount(s)

句子结尾加&:后台情势运作

jobs 工作

(command 1;command 2…卡塔尔(قطر‎ 任务列表,能够何况实行

coproc 协程(后台有个子shell,推行你的授命,同时生成五个job卡塔尔(قطر‎

which 查看命令程序所在地点

history 命令历史记录

  !! 上三个历史命令(省着按进步箭头了卡塔尔

  !number 第n条历史命令被履行

11.1采纳两个指令

$date;who   //  命令列表,参与分号就能够,那样会相继推行。参见5.2.1节

只顾区分$(date;who卡塔尔国,这么些是经过列表,会扭转贰个子shell来实施

Shell脚本的关键在于输入八个指令并管理每一个命令的结果,以致须要将四个指令的结果传给别的一个发令。

Shell能够令你将多少个指令串起来,二次性完毕。

 

地点的date;who能够写入一个文本,这样就毫无在命令行敲命令了,运营那么些文件文件就好了。

 

  1. 开创Shell脚本文件

  2. 体现新闻

  3. 选择变量

  4. 反引号

  5. 重定向输入输出

  6. 管道

  7. 试行数学生运动算

  8. 脱离脚本

环境

printenv 查看意况变量(env只好查看全部的全局变量卡塔尔(قطر‎; 本命令辅协助调查看某条变量(不需求加加元符号,echo必要)

set 查看|设置景况变量

export 处处变量为全局变量,就能够在各类shell中使用了(并无法使shell的父shell情形变量发生变化)

unset 删除情形变量

passwd (chpasswd卡塔尔 密码查看|纠正

umask 为文件分配默许权限

chmod 纠正权限

chown 纠正归于权

11.2 成立shell脚本文件

首先行必得那样:钦点要选用的shell

#!/bin/bash

 

1.平日景况#用来疏解的,不过首先行的#除外

例如写二个test,内容如下:

#!/bin/bash

date

who

 

假虚构从来运维,要求将路径增多到PATH遇到变量中去。

也得以当前目录直接./test,那样只怕会并未有权限。

chmod u x test   //  扩充实施权限

接着即可  ./test 运维了

 


分区

fdisk 分区;p:突显基本设备音讯;n:new个分区;w:write进设备

mkefs 格式化ext分区;

mke2fs 格式化ext2分区;

mkfs.ext3 格式化ext3分区;

mkfs.ext4 格式化ext4分区;

mkreiserfs 格式化reiserfs分区

jfs_mkfs 格式化jfs分区

mkfs.xfs 格式化xfs分区

mkfs.zfs 格式化zfs分区

mkfs.btrfs 格式化btrfs分区

fsck 检查修复分区 -a:自动物检疫查实验修复;-A:列出fstab中颇有分区,并检验;-C:突显帮助的文件系统一检查测时的快慢条(ext2、3);-s:七个文件系统依次检查;

LVM 能够增进多少个硬盘到一个卷组(整合为一个大分区也从没难题),能够创建快速照相,镜像。

怎么样创制LVM物理卷?使用fdisk t来改造分区类型(为8e);或行使pvcreate创造,pvdisplay查看创设进程;

vgcreate 创设卷组(为物理卷);举例:vgcreate Vol1 /dev/sda1;vgdisplay查看进程

lvcreate 创造逻辑卷;比方:lvcreate –l 100%FREE –n lvtest Vol1;lvdisplay查看进程

严寒这样还远远不够!!!还要有文件系统,如ext4的LVM:mkfs.ext4 /dev/Vol1/lvtest。上述创造了三个ext4类别的逻辑卷lvtest。还要手动挂载:mount /dev/Vol1/lvtest /mnt/my_partation

LVM的一群管理命令:

vgchange 激活和剥夺卷组
vgremove 删除卷组
vgextend 将物理卷加到卷组中
vgreduce 从卷组中剔除物理卷
lvextend 扩充逻辑卷的大大小小
lvreduce 减小逻辑卷的尺寸

11.3 展现消息

想在本子上加提醒音讯,能够直接那样:

#!/bin/bash

echo  haha,I am xiaochongyong, data print:

date

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

who

 

倘诺想要输出单引号,须要加双引号把整句话括起来,不然会不正规。比方:

 必赢的网址登录 1

 

还是能够如此:

 必赢的网址登录 2

 

echo命令能够用单引号或双引号来划定文本字符串。假若在字符串中用到了它们,须要在文件中利用生龙活虎种引号,而用别的大器晚成种来将字符串划定起来

 

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

#!/bin/bash

echo  –n  “The time and date are: ”

date

 

  1. 创办脚本文件的时候,必需将文件的第意气风发行内定要选取的shell。其格式为:

2.shell编程

变量是宽大的概念,任何由字母、数字或下划线组成的文本字符串,长度不抢先十几个。客户变量区分朗朗上口写,所以变量 Var1 和变量 var1 是见仁见智的。

shell编制程序最苍劲的地点在于可以从console的出口中取回这几个输出,并随意采取,黄金年代旦那样做,则足以接收shell做别的职业了,只要你能在console中输出它。

如何从shell中获取输出的源委?二种办法:

  1. 反引号符号;
  2. $();

 举个例子,使用date命令可以输出当前时光,假若写shell脚本的话,能够因而如下二种写法获取console的date:

1 date=$(date);
2 date=`date`;

字符串固然统生龙活虎的话,直接各样引号,而没有需求 可能其余的操作,如:

str1="string1";
str2="string2";
str3=$str1$str2;

出口或引用一个变量,则能够:

echo $str3;

输出重定向:>

在已部分文件中追加内容:>>

输入重定向:<

内联输入重定向:<<

管道:|

实际,windows console中也扶持管道.

举例说,以前用more对console的开始和结果张开分页:ls -al |more

既然如此是管道,必然扶持广大管道,纵然大概只会用到多个

shell中计算:expr

举个例子说计算1 2:

expr 1   2
#注意上式的空格,运算符间都是有的
表11-1 expr 命令操作符
arg1 |arg2  如果arg1既不是null也不是0,返回arg1;否则arg2
ARG1 & ARG2 如果没有参数是null或零值,返回 ARG1 ;否则返回 0
< 如果 ARG1 小于 ARG2 ,返回 1 ;否则返回 0
<= 如果 ARG1 小于或等于 ARG2 ,返回 1 ;否则返回 0
= 如果 ARG1 等于 ARG2 ,返回 1 ;否则返回 0
!= 如果 ARG1 不等于 ARG2 ,返回 1 ;否则返回 0
>= 如果 ARG1 大于或等于 ARG2 ,返回 1 ;否则返回 0
> 如果 ARG1 大于 ARG2 ,返回 1 ;否则返回 0
 
-  
*  
/  
%  
STRING : REGEXP 如果 REGEXP 匹配到了 STRING 中的某个模式,返回该模式匹配
match STRING REGEXP 如果 REGEXP 匹配到了 STRING 中的某个模式,返回该模式匹配
substr STRING POS LENGTH 返回起始位置为 POS (从 1 开始计数)、长度为 LENGTH 个字符的子字符串
index STRING CHARS 返回在 STRING 中找到 CHARS 字符串的位置;否则,返回
index STRING CHARS 返回字符串 STRING 的数值长度
TOKEN 将 TOKEN 解释成字符串,即使是个关键字
(EXPRESSION) 返回 EXPRESSION 的值

急需注意,尽大概的把运算符号以前增进转义字符,不然很可能会促成expr收到错误!

例如 expr 1 * 2

故此,bash shell为了保险跟Bourne shell的匹配而含有了 expr 命令,但它同样也提供了大器晚成种更简便易行方法来施行数学表明式。在bash中,在将叁个数学运算结果赋给有个别变量时,能够用欧元符和方括号( $[ operation ] )将数学表达式围起来。

如此,就异常平价了,照旧1 2,则足以写成:

$[1 2]

而素有不必要思索空格的主题材料~~~

此地要求留意的是,bash shell本身不支持浮点数运算,所以能够接纳其它的办法:

bash计算器:bc;

动用bash供给小心,精度(scale)暗中认可为0,所以必要设置:scale=0

bc自身支持定义变量

 在剧本中运用bc:

echo “scale=4;1/2” |bc
# 或
echo “scale=4;print 1/2” |bc

 越来越好的点子是选择内联输入重定向(<<卡塔尔(قطر‎:

#!/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

## EOF既是输入的开始,又是输入的结束,所以计算没有问题的

剧本退出命令:

exit exitCode

查阅退出代码:

echo $?

脱离代码意图:

0 命令成功结束
1 一般性未知错误
2 不适合的shell命令
126 命令不可执行
127 没找到命令
128 无效的退出参数
128 x 与Linux信号x相关的严重错误
130 通过Ctrl C终止的命令
255 正常范围之外的退出状态码

11.4 使用变量

平凡会须求在shell命令使用任何数据来管理音讯,能够通过变量来促成。

变量允许你有的时候性的将音讯囤积在shell中,以便越剧本中的别的命令大器晚成道行使

#!/bin/bash

 条件构造:if,then,elif,fi

if command
#注意是command不是condition!
then
  commands
elif command
then
      commands
...
else
  commands
  ...
  if command
  then
    commands
  fi
fi
#或
if command;then
  commands
fi

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”

 

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

 

运营脚本文件时要制定文件地方,还要予以文件运维的权柄:

test

如何是condition呢?答案是:

test,即if行由command 前边改为:

test condition

11.4.2 顾客变量

Shell脚本还允许在本子中定义和应用本身的变量。

概念变量允许有的时候存款和储蓄数据并在本子中动用,那样看起来更疑似三个前后相继了。

客商变量能够是其余字母数字或下划线组成的文本字符串,长度不超过十多个。区分朗朗上口写

采纳=给客户变量赋值,变量=和值时期不能够有空格

比如:

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"

 

chmod u x file

数值比较

例如:

ret=1
if test ret -eq 1
then
    echo ret is 1
fi

关于里面包车型地铁-eq,则是度量准则的意气风发种样式:等于。

test 命令的数值正如效果与利益

说明

等效

n1 -eq n2

==

=

-ge

>=

>=

-gt

>

<

-le

<=

<=

-lt

<

<

-ne

!=

!=

test的另风华正茂种写法是:

[ condition ]
#注意方括号都和condition有空格的!!!

譬喻说,将test子例改写一下,即:

ret=1
if [ ret -eq 1 ]
then
    echo ret is 1
fi

test可以做:

 数值相比较
 字符串相比较
 文件比较

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。

 

www.437.com,运行:./file

字符串相比较

test字符串比较测试
str1=str2 ==
!=  
< len
> len
-n len>0
-z len=0

刻意须要留意轻松犯错误的地点在于符号会与bash自个儿的意气风发对符号冲突而造成实施出错!!!包涵:

<,>.

由此要进行转义,即:

必赢官网,>,<.

11.5 重定向输入和出口

  1. 显示音讯:echo命令,比方:

文本比较

文件比较功能参数
-d file 存在目录
-e file exist
-f file 存在文件
-r file read
-s file 文件空
-w file write
-x file execute
-O file own
-G file group
file1 -nt file2 new than
file1 -ot file2 old than

什么轻便的收获条件推断时规格的结果吗?

test 1 = 1;echo $?

上句测验,为真,彰显0

在乎:test的两个参数,不应有在里边计算,而相应在事情发生前的步骤落成,不然恐怕会获取错误的结果!!!(亲测)

举个例子说:一定期存款在$HOME,所以test -e $HOME 必然为真(0)。

而是,若是$HOME中不设有123索引或文件夹,则test -e $HOME/123依旧会回到0.

而依照本人写的注目,写为x1=$HOME/123;test -e $1;echo $?则会重临1,即真实结果.

进而自然要留意这种意况!

11.5.1输出重定向

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

Command > outfile

例如:who > test6  不设有则创立,存在则覆盖

pwd >> test6  那样会追加

 

#!/bin/bash

更加多的标准化:

&&,||

11.5.2 输入重定向

1.将文件的故事情节重定向到命令

小于号  <

wc命令能够对数据中的文本进行计数。

私下认可会输出文本的行数,文本的词数,文本的字节数

比如:

wc < test6

 必赢的网址登录 3

2.内联输入重定向:无需接纳文件举办重定向,只须要在命令行中钦赐顾客输入重定向的多少就足以了。

符号:  <<

还索要钦命二个文本标识来划分输入数据的上三宝太监结尾,任何字符串都得以看成文本标识,但在数额的开首和最后文本标识必得风姿浪漫律。

 必赢的网址登录 4

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

 

echo "========请输入顾客名========="

更加高档的数值规范:((卡塔尔国卡塔尔国

(())操作符
val  
val--  
val  
--val  
!
~ 按位非
**
<<  
>>  
& 按位与
| 按位或
&& 逻辑与
|| 逻辑或

测验进程中,开采,还帮忙广大操作:==,!=,<,>,<=,>=, ,-,*,/.

别的,((卡塔尔国卡塔尔(قطر‎无需转义以至空格!!!

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卡塔尔(英语:State of Qatar) 遵照第多个字段基于数值的样式开展符合规律排序(由小到大卡塔尔(قطر‎。

    #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利用率高的十多个经过:

    #1卡塔尔(英语:State of Qatar)通过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卡塔尔(英语:State of Qatar) 通过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

    6896      /usr/local

    4           /usr/games

    4           /usr/etc

    0           /usr/tmp

   

    2.  批量更动文件名:

    #1卡塔尔(قطر‎ find命令找到文件名扩大名称为.output的文书。

    #2卡塔尔(英语:State of Qatar)sed命令中的-e选项表示流编辑动作有频仍,第一次是将找到的文书名中相对路线前缀部分去掉,如./aa改为aa。

    #    流编辑的第二有个别,是将二零一三0311沟通为mv & 二零一二0310,当中&表示s命令的被轮番部分,这里即源文件名。

    #    1表示被改造部分中#的(.*)。

    #3卡塔尔(英语:State of Qatar) 那时的输出应该为

    #    mv 20110311.output 20110310.output

    #    mv 20110311abc.output 20110310abc.output

    #    最终将地方的出口作为命令交给bash命令去推行,从而将享有二〇一一0311*.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卡塔尔(英语:State of Qatar) awk打字与印刷输出grep查找结果的首先个字段,即pid字段。

    #4卡塔尔(英语:State of Qatar)下面的四个组成命令是在反引号内被实施的,并将奉行的结果赋值给数组变量${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卡塔尔(英语:State of Qatar)cpio从find的结果中读取文件名,将其卷入压缩后发送到./dest/dir(指标目录卡塔尔(قطر‎。

    #2卡塔尔(قطر‎ cpio的取舍介绍:

    #    -d:创造供给的目录。

    #    -a:重新设置源文件的拜候时间。

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

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

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

  1. 动用变量:

越来越高等的字符串条件:[[]](20章)

高级成效:regex,

11.7 实施数学生运动算

有三种路子:

Linux中变量分为情状变量和顾客变量二种。景况变量正是系统意况中自带的变量,比方set命令能够查阅全体的景况变量。顾客变量正是客户自个儿定义的变量,只存在于方今的shell中。

更加高档的规范结构:case

case variable in
pattern1 | pattern2 ) commands1 ;;
pattern3 ) commands2 ;;
*) default commands ;;
esac

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命令操作符表能够看一下。

在本子文件中援用变量的时候要用加元符:$,。举例:

 越多的布局化:for

for var in list
do
commands
done

地方所说的list,其实能够是字符串(每一种项以空格分开,假诺想制止项中有空格,则足以为各类项加豆蔻梢头对引号,假如同有的时候候设有引号,最佳转义,用另风流洒脱种引号次之)。

如上所述,那些for用着依旧还未编制程序语言的方便,若是想举办98次有个别命令,那么必要生成三个存有100项的列表。

for star in $(ls)
 do 
    echo "111 $star"
done

 

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

#!/bin/bash

11.7.3 浮点解决方案

有三种缓慢解决方案,最广泛的是用内建的bash电脑,叫做bc

1.bc的大旨用法

bashComputer实际上是生龙活虎种编制程序语言,它同目的在于命令行中输入浮点表明式,然后解释并总计表明式

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

 必赢的网址登录 5

 

BashComputer设置好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

)

 必赢的网址登录 6

比如:

#!/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命令的出口赋给变量

将甄选和表明式放在脚本的不等行能够让管理进度变得明明白白。

还足以在bashComputer中赋值给变量,在bcComputer中开创的变量只在bc计算机中央银一蹴而就,无法再shell脚本中动用

 

echo "UID id : $UID"

11.8 退出脚本

Shell中运作的每一个命令都应用退出吗告诉shell它早就运营达成。

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

概念顾客变量的时候无法现身空格:var=100

11.8.1 查看退出状态码

哪些查看:echo &?

惯例是三个打响甘休的授命的退出码是0,借使一个指令结束时有错误,退出状态就是正整数。

 

  1. 反引号

11.8.2 exit命令

暗许意况下,shell脚本会以脚本中的末了一个命令的退出状态码退出。

也能够改正这种行为

这么写: exit 5

再在顶峰中查看一下:

 必赢的网址登录 7

Linux中的反引号能够将shell命令的输出赋值给变量:

补给:关于内联重定向

大旨格局如下:

command  << delimiter

*  document*

delimiter

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

首要用场:用于脚本命令行人机联作

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

例子1:

#!/bin/bash

cat << EOF

hahaha1

hahaha2

hahaha3

EOF

echo exit code is $?

 

以此比很小好精通

 

#!/bin/bash

test=`date`

echo $test

  1. 重定向输入输出

输出:将下令施行的结果输出到文件中保存

输入:将文件输入给命令使用

重定向输出使用过量号:>

重定向输入使用小于号:<

#!/bin/bash

date > test6

test6<wc

  1. 管道

管道是将贰个限令的输出作为下三个下令的输入,举例:

#!/bin/bash

set | more

  1. 数学生运动算

Linux shell中使用expr作为整数的运算,使用bc进行浮点数的演算,比如:

#!/bin/bash

test1=`expr 1 * 5`

echo $test1

var1=`echo " scale=4; 3.44 / 5" |bc`

echo $var1

  1. 退出脚本

#!/bin/bash

exit 5


技能树.IT修真院

“大家相信徒人都足以改为三个程序猿,将来开端,找个师兄,带你入门,掌握控制自身读书的点子,学习的途中不再盲目”。

此处是本领树.IT修真院,不知凡几的师兄在这找到了团结的读书路径,学习透明化,成长可以预知化,师兄1对1免费辅导。快来与自己贰只上学吧 !

注册邀约码:99872160      注册链接:IT修真院

编辑:操作系统 本文来源:《Linux命令行与shell脚本编程大全》第十一章 构建

关键词: 必赢官网