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

图片 6

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编程

变量是宽松的定义,任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量
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脚本还允许在脚本中定义和使用自己的变量。

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

用户变量可以是任何字母数字或下划线组成的文本字符串,长度不超过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”

 

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。

 

运行:./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) 按照第五个字段基于数值的形式进行正常排序(由小到大)。

    #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

    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

  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用着还是没有编程语言的方便,如果想执行100次某些命令,那么需要生成一个具有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的基本用法

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

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

 图片 5

 

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

)

 图片 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命令的输出赋给变量

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

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

 

echo “UID id : $UID”

11.8 退出脚本

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

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

定义用户变量的时候不能出现空格:var=100

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图