1. 使用多个命令

如果要两个命令或者多个命令一起运行,可以把它们放在同一行中,彼此间用分号隔开。

2. 创建 shell 脚本文件

例如:

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

这就是脚本的所有内容了。可以根据需要,使用分号将两个命令放在一行上,但在shell脚本中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。

3 显示消息

可以将echo语句添加到shell脚本中任何需要显示额外信息的地方。

$ vim test1 
#!/bin/bash
# This script displays the date and who's logged on
echo The time and date are:
date
echo "Let's see who's logged into the system:"
who

当运行这个脚本时,它会产生如下输出:

4. 使用变量

4.1环境变量

在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。下面的脚本

演示了这种用法:

$ vim test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

输出:

4.2用户变量

用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。使用等号将值赋给用户变量,在变量、等号和值之间不能出现空格。

$ vim test3
#!/bin/bash
# testing variables
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

输出:

4.3命令替换

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

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

  1. 反引号字符(`)
  2. $()格式

要注意反引号字符,在美式键盘上,它通常和波浪线(~)位于同一键位。

使用普通的shell命令输出创建变量的例子:

$ vim test5
#!/bin/bash
testing=$(date)
echo "The date and time are: " $testing

变量testing获得了date命令的输出,然后使用echo语句显示出它的值。运行这个shell脚本生成如下输出:

再举一个例子:通过命令替换获得当前日期并用它来生成唯一文件名。

#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today

运行该脚本之后,应该能在目录中看到一个新文件:

-rw-r--r--    1 user     user          769 Jan 31 10:15 log.191125

5重定向输入和输出

重定向可以用于输入,也可以用于输出,可以将文件重定向到命令输入.

5.1输出重定向

基本的重定向将命令的输出发送到一个文件中。bash shell用大于号(>)来完成这项功能:

command > outputfile

5.2输入重定向

输入重定向和输出重定向正好相反。输入重定向将文件的内容重定向到命令,而非将命令的输出重定向到文件。输入重定向符号是小于号(<):

command < inputfile

一个简单的记忆方法就是:在命令行上,命令总是在左侧,而重定向符号“指向”数据流动的方向。小于号说明数据正在从输入文件流向命令。

$ wc < test6
2 11 60

6管道

我们用不着将命令输出重定向到文件中,可以将其直接重定向到另一个命令,这个过程叫作管道连接。符号是(|),在美式键盘上,它通常和反斜线(\)位于同一个键。管道被放在命令之间,将一个命令的输出重定向到另一个命令中:

command1 | command2

Linux系统会同时运行这两个命令,在系统内部将它们连接起来。在第一个命令产生输出的同时,输出会被立即送给第二个命令。数据传输不会用到任何中间文件或缓冲区。

也可以用一条文本分页命令(例如less或 more)来强行将输出按屏显示。

$ rpm -qa | sort | more

7执行数学运算

7.1expr命令

expr命令能够识别少数的数学和字符串操作符:

操 作 符

描  述

ARG1 | ARG2

如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2

ARG1 & ARG2

如果没有参数是null或零值,返回ARG1;否则返回0

ARG1 < ARG2

如果ARG1小于ARG2,返回1;否则返回0

ARG1 <= ARG2

如果ARG1小于或等于ARG2,返回1;否则返回0

ARG1 = ARG2

如果ARG1等于ARG2,返回1;否则返回0

ARG1 != ARG2

如果ARG1不等于ARG2,返回1;否则返回0

ARG1 >= ARG2

如果ARG1大于或等于ARG2,返回1;否则返回0

ARG1 > ARG2

如果ARG1大于ARG2,返回1;否则返回0

ARG1 + ARG2

返回ARG1和ARG2的算术运算和

ARG1 - ARG2

返回ARG1和ARG2的算术运算差

ARG1 * ARG2

返回ARG1和ARG2的算术乘积

ARG1 / ARG2

返回ARG1被ARG2除的算术商

ARG1 % ARG2

返回ARG1被ARG2除的算术余数

STRING : REGEXP

如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

match STRING REGEXP

如果REGEXP匹配到了STRING中的某个模式,返回该模式匹配

substr STRING POS LENGTH

返回起始位置为POS(从1开始计数)、长度为LENGTH个字符的子字符串

index STRING CHARS

返回在STRING中找到CHARS字符串的位置;否则,返回0

length STRING

返回字符串STRING的数值长度

+ TOKEN

将TOKEN解释成字符串,即使是个关键字

(EXPRESSION)

返回EXPRESSION的值

7.2使用方括号

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

输出:

7.3 浮点解决方案

1. bc的基本用法

bash计算器实际上是一种编程语言,它允许在命令行中输入浮点表达式,然后解释并计算该表达式后返回结果。bash计算器能够识别:

  • 数字(整数和浮点数)
  • 变量(简单变量和数组)
  • 注释(以#或C语言中的/* */开始的行)
  • 表达式
  • 编程语句(例如if-then语句)

函数可以在shell提示符下通过bc命令访问bash计算器:

浮点运算是由内建变量scale控制的。必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果:

除了普通数字,bash计算器还能支持变量:

变量一旦被定义,你就可以在整个bash计算器会话中使用该变量了。print语句允许你打印变量和数字。

2. 在脚本中使用bc

基本格式如下:

variable=$(echo "options; expression" | bc)

第一部分options允许你设置变量。如果你需要不止一个变量,可以用分号将其分开。expression参数定义了通过bc执行的数学表达式。这里有个在脚本中这么做的例子:

$ vim test10
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)
echo The answer for this is $var3

输出:

8退出脚本

shell中运行的每个命令都使用退出状态码(exit status)告诉shell它已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由命令传给shell。

状 态 码

描  述

0

命令成功结束

1

一般性未知错误

2

不适合的shell命令

126

命令不可执行

127

没找到命令

128

无效的退出参数

128+x

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

130

通过Ctrl+C终止的命令

255

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

查看状态码:

$ date
Sat Jan 15 10:01:30 EDT 2014
$ echo $?
0

exit命令允许你在脚本结束时指定一个退出状态码:

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

当查看脚本的退出码时,你会得到作为参数传给exit命令的值:

特别注意,退出状态码被缩减到了0~255的区间。shell通过模运算得到这个结果。所以最终的结果是指定的数值除以256后得到的余数。比如指定的状态码值是300,那么最终的状态退出码是44(300%256=44)。

Shell编程—基础脚本的更多相关文章

  1. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  2. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  3. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  4. Shell编程-12-Shell脚本规范及调试

    目录 Shell脚本规范 Shell脚本调试 Shell脚本规范     良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...

  5. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  6. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  7. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  8. 6-2 shell编程基础

    shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...

  9. Shell编程(脚本)的经常使用命令和语句

    一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...

随机推荐

  1. reverse 字符串翻转

    头文件 algorithm string s="hello"; reverse(s.begin(),s.end()); char c[]="hello"; re ...

  2. Java语言概述_章节练习题及面试

    学于尚硅谷开源课程 宋洪康老师主讲 感恩 尚硅谷官网:http://www.atguigu.com 尚硅谷b站:https://space.bilibili.com/302417610?from=se ...

  3. 零起点PYTHON机器学习快速入门 PDF |网盘链接下载|

      点击此处进入下载地址 提取码:2wg3 资料简介: 本书采用独创的黑箱模式,MBA案例教学机制,结合一线实战案例,介绍Sklearn人工智能模块库和常用的机器学习算法.书中配备大量图表说明,没有枯 ...

  4. matplotlib基础汇总_03

    四图 直方图 [直方图的参数只有一个x!!!不像条形图需要传入x,y] hist()的参数 bins 可以是一个bin数量的整数值,也可以是表示bin的一个序列.默认值为10 normed 如果值为T ...

  5. Numpy数组排序

    import numpy as np x = np.array([1,4,5,2]) # array([1, 4, 5, 2]) # 返回排序后元素的原下标 np.argsort(x) # array ...

  6. CF R639 div 2 E Quantifier Question 数学 dfs 图论

    LINK:Quantifier Question 题面过长 引起不适 读题花了好长时间 对于 和 存在符合不是很熟练 导致很懵逼的做完了. 好在还算很好想.不过wa到了一个坑点上面 自闭一大晌 还以为 ...

  7. ABC 162 F Select Half dp 贪心

    LINK:Select Half 考试的时候调了一个小时给调自闭了 原来是dp的姿势不太对. 首先 容易发现 奇数最多空2个位置 偶数最多空1一个位置 然后 设f[i][j][k]表示第i个数选了没有 ...

  8. PAM学习笔记

    想了想 还是要先把字符串的东西先都学完告一段落了再说 时间不多了 加油~. PAM 回文自动机 比SAM简单到不知道哪里去了. 回文自动机和其他自动机一样有字符集 有状态 有转移. 一个字符串的回文自 ...

  9. NCoreCoder.Aop 国庆更新

    原本的IAopActors如下 public interface IAopActors { object Execute(AopContext context); Task<TResult> ...

  10. 国浩:Cassandra在360的最新进展

    大家好,我是来自奇虎360的国浩.今天我给大家带来的是Cassandra在360的最新进展. 我会从四个方面来介绍Cassandra在360的应用情况:Cassandra在360的使用历史再结合两个案 ...