第十章 构建基本脚本
来源:互联网 发布:直销矩阵制示意图 编辑:程序博客网 时间:2024/05/21 05:05
创建shell脚本文件:
在创建shell键本文件时,必须在文件的第一行指定要使用的shell;格式为:
#! /bin/bash
通常, #用作注释行,不被shell执行。但shell脚本的第一行是个特例,井号后接叹号告诉shell用哪个shell来运行脚本。
第一行之后,通常就在下面加一行注释行,由#开头,然后写下此脚本的用途(要养成这个好习惯)。
显示消息
echo命令能显示一个简单的文本字符串。
echo This is a test
This is a test。
默认情况下不需要使用引号将要显示的文本字符串圈起来。但有时在文本中出现引号就比较麻烦。
echo Let's see if this 'll work.
此时,你需要这样写
echo "Let's see if this'll work。
echo命令是shell脚本中同用户交互的重要工具。你会在很多情况下用到它,尤其是当你要显示脚本中变量的值时。
使用变量
环境变量:先用set指令列出一份完整的活动的环境变量,然后可以在环境变量名称前加个美元符($)来载脚本中使用这些环境变量。如下脚本:
#!/bin/bash
#display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID.
但有时,这并不都有效,例如我想显示美元,echo "The cost of the item is $15"。运行时会显示The cost of the item is 5.要显示美元符,必须在前面加个转义符,即反斜杠\。如下: echo “The cost of thie item is \$15"
用户变量:
除了环境变量,shell脚本还允许在脚本中定义和使用自己的变量。
用户变量可以是不超过20个字母、数字或下划线的文本字符串,区分大小写。
值通过等号赋给用户变量。在变量、等号和值之间不能出现空格(困扰初学者的地方)。一些例子如下:
var1=10;
var2=testing;
var3="still more testing"
shell脚本会自动决定变量值的数据类型。在脚本的正个生命周期里,shell脚本定义的变量会一直保持他们的值。知道shell脚本完成时删除。类似于系统变量,用户变量可以通过美元符引用:
#!./bin/bash
# testing variables
days=10
guest="Katie" #这里可以不用加双引号
echo "$guest checked in $days days ago"
变量每次引用时,都会输出当前赋予它的值。引用一个变量时需要使用美元赋,而引用变量来对它进行赋值时则不能使用美元符。例子如下:
#! /bin/bash
#assigning a variable value to a value
value1=10
value2=$value1
echo The resulting value is $value2
此脚本的结果是:The resulting value is $value2.
但如果忘了$,使得value2赋值行变成这样: value2=value1. 输出会是The resulting value is value1.没有美元符,shell会将变量名解释成普通的文本字符串。
反引号
shell中最有用的特性之一就是反引号。提示:在美式键盘上,它通常和波浪线(~)位于同一个键位。
必须用反引号把整个命令行命令圈起来: testing=`date`
shell会运行反引号中的命令,并将其输出赋给变量testing。例子如下:
#! /bin/bash
# using the backtick character
testing=`date`
echo "The date and time are: " $testing
重定向输入和输出
输出重定向:
command>outputfile
重定向操作符创建了一个文件(通过默认的umask设置权限)。如果文件本存在,则会将新的数据覆盖已经存在的文件。若不想覆盖,则需要改>为>>.
输入重定向:
和输出重定向正好相反。command<file;
还有另外一种输入重定向,称为内联输入重定向。这种方法允许你在命令行而不是在文件指定输入重定向的数据。内联输入重定向使用的是<<(双小于号)。
除了这个符号,你必须要指定一个文本标记来划分要输入数据的开始和结尾。可以用任何字符串的值来作为文本标记,但在数据的开始和结尾必须一致:
command<<marker
data
marker
一个例子:
wc<<EOF
>test string1
>test string2
>test string3
>EOF
3 9 42
管道
虽然重定向很有用,但仍然是一种比较繁琐的生成信息的方式。取代将命令的输出重定向到文件,可以重定向输出到另一个命令。这个过程就称为管道链接。
command1 | command2
在管道中,链接并不会一个接一个的运行。Linux系统实际上会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会立刻送给第二个命令,传输数据不会用到任何中间文件或缓冲区域。
可以在一条命令中使用任意多条管道。
执行数学运算
shell脚本中有两种途径来进行数学运算操作。
expr命令:允许在命令行上处理数学表达式,但比较笨拙。注意:操作符两边都有空格,否则输不出运算结果。由于expr指令处理起来会带来很多的问题,所以一般不用,下面有个改进的指令。
使用方括号:
在bash中,将一个数学运算结果赋给某个变量时,可以用美元符和方括号($[ operation ])将数学表达式圈起来:
var1=$[ 1 + 5 ]
echo $var1
6
var2=$[ $var1 * 2 ]
echo $var2
12
但方括号也有一个限制,就是只支持整数运算。要进行任何的数学运算,回事一个巨大的限制。
浮点解决方案:
最常见的解决方法就是用内建的bash计算器,称作bc。
bc的基本用法:
bash计算器其实是允许你在命令行输入浮点表达式、解释表达式、计算并返回结果的一种编程语言。bash计算器能识别:
数字(整数和浮点数);
变量(简单变量和数组);
注释(以井号开始的行或C语言中的/* */对);
表达式;
编程语句(例如if-then 语句);
函数。
浮点运算是由一个内建的称为scale的变量控制的。你必须将这个值设置为结果里你想要的小数点后的位数,否则你不胡得到你想要的结果:
bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit
scale变量的默认值是0.在scale被设置前,bash计算器提供的答案没有小数点后的位置。在将其值设置成4后,bash计算器显示的答案有四位小数。
除了普通字,bash计算器还能支持变量:
bc -q (-q参数会将bc输出的很长的欢迎条屏蔽掉)
var1=10
var1 * 4
40
var2=var1 / 5
2
quit
一旦变量的值被定义了,你就可以在整个bash计算器会话中使用变量了。printf 语句允许你打印变量和数字。
在脚本中使用bc
可以使用反引号来运行bc命令并将输出赋给一个变量。基本格式是:
variable=`echo "options: expression" | bc`
第一部分options允许你来设置变量。如果你需呀设置不止一个变量,可以用分号来分开它们。expression参数定义了通过bc执行的数学额表达式。例子:
#! /bin/bash
var1=`echo "scale=4; 3.44 / 5" | bc`
echo The answer is $var1
但如果有很多运算,那么在同一个命令行中列出多个表达式就会有点麻烦。
针对 这个问题,解决之道是:bc能识别输入重定向,允许将一个文件重定向到bc命令来处理。然而这样也同样麻烦,因为你必须将表达式存储到文件中。
最好的办法是使用内联输入重定向,允许你直接在控制台重定向数据。在shell脚本中,可以将输出赋给一个变量:
variable=`ba << EOF
options
statements
expressions
EOF
`
#! /bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=`bc << EOF
scale=4
a1 = ( $var1 * $var2)
b2 = ( $var3 * $var4)
a1 + b1
EOF
`
echo The final answer for this mess is $var5
退出脚本
shell中运行的每个命令都使用推出状态码(exit status)来告诉shell它完成了处理。推出状态码是一个0~255之间的整数值,在命令结束运行时由命令传给shell。
查看退出状态码
Linux提供了$?专属变量来保存上个执行的命令的推出状态码。必须在你要查看的命令之后马上查看或使用$?变量。它的值会变成shell中执行的最好哦一条命令的推出状态码:
$ date
Sat Jan 15 10:01:30 EDT 2011
$ echo $?
0
$
按照惯例,一个成功结束的命令的退出状态码是0. 如果一个命令结束时有错误,推出状态码中就会有一个正数值:
$ asdfg
-bash: asdfg: command not found
$ echo $?
127
无效命令会返回一个推出状态码127.
下表为Linux推出状态码:
状态码 描述
0 命令成功结束
1 通知未知错误
2 误用shell命令
126 命令不可执行
127 没找到命令
128 无效退出参数
128+x Linux信号x的严重错误
130 命令通过Ctrl+C终止
255 退出状态码越界
推出状态码为126表明用户没有执行命令的正确权限
$ ./myprog.c
-bash: ./myprog.c : Permission denied
$ echo $?
126
另一个会经常碰到的常见错误是给某个命令提供了无效参数:
$ date %t
date: invalid date '%t'
$ echo $?
1
exit命令
默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出:
$ ./test6
The result is 2
$ echo $?
0
exit命令允许你在脚本结束时指定一个推出状态码:
#! /bin/bash
# testing the exit status
var1=10
var2=30
var3=$[ $var1 + var2 ]
echo The answer is $var3
exit 5
注意:退出状态码最大只能是255。
- 第十章 构建基本脚本
- linux命令行与shell脚本大全_第十章_构建基本脚本
- Gradle--第六章、基本构建脚本
- Gradle--第六章、基本构建脚本2
- gradle--第六章、基本构建脚本3
- 第11章 构建基本脚本
- 构建基本脚本
- 构建基本脚本
- 构建基本的脚本
- Chapter 6.基本构建脚本
- Linux学习 构建基本脚本
- gradle--第十三章 编写基本的构建脚本
- 《Linux命令行与shell脚本》笔记--第10章:构建基本脚本
- 第十章 基本数据结构
- 第十章 基本数据结构
- 第十章 基本数据结构
- Linux Shell脚本编写——构建基本脚本(一)
- Shell脚本编程基础 二 构建基本脚本
- Shell脚本调试技术
- 黑马程序员——集合工具类
- 使用highChart做报表统计
- ubuntu 14.04 install ibus
- life is tough!最可怕的是牛人还那么努力!
- 第十章 构建基本脚本
- Apache与Nginx的优缺点比较
- linux 文件格式(1) sed工具
- Makefile条件判断 ——————————【Badboy】
- 【unity3d Editor开发】简单节点编辑器(一)
- Android中如何做到Service被关闭后又自动启动
- 插入排序
- qsort对动态二维数组进行排序
- C++对象作为函数参数