Shell编程—基础脚本
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脚本中,有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。
有两种方法可以将命令输出赋给变量:
- 反引号字符(`)
- $()格式
要注意反引号字符,在美式键盘上,它通常和波浪线(~)位于同一键位。
使用普通的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编程—基础脚本的更多相关文章
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- Shell编程-12-Shell脚本规范及调试
目录 Shell脚本规范 Shell脚本调试 Shell脚本规范 良好的代码规范不仅方便阅读,也利于维护和提升开发效率.因此建议大家在编写Shell脚本时养成良好的代码习惯.今天就和大家探讨一 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- 6-2 shell编程基础
shell编程基础 编程基础 Linus:Talk is cheap, show me the code 程序和编程风格 程序: 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结 ...
- Shell编程(脚本)的经常使用命令和语句
一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求. 接收到的命令參数: 參数个数: $# 參数值: 命令本身:$0 第一个參数:$1 第二个參数:$2 -- 退出命令: exit ec ...
随机推荐
- Python while 循环中使用 else 语句
Python while 循环中使用 else 语句: else:表示 while 中的语句正常执行完,然后执行 else 语句的部分. 示例: # while 判断条件: # 一行语句 或 多行语句 ...
- PHP array_product() 函数
实例 计算并返回数组的乘积: <?php$a=array(5,5);echo(array_product($a));?> 运行实例 » 定义和用法 array_product() 函数计算 ...
- PHP convert_uuencode() 函数
实例 编码字符串: <?php$str = "Hello world!";echo convert_uuencode($str);?>高佣联盟 www.cgewang. ...
- C#后台实现在Grid标签中动态新增CheckBox标签(WPF中)
页面代码 <Grid Margin="45,0,10,0" > <Grid.RowDefinitions> <RowDefinition Height ...
- C/C++编程笔记:C++入门知识丨继承和派生
本篇要学习的内容和知识结构概览 继承和派生的概念 派生 通过特殊化已有的类来建立新类的过程, 叫做”类的派生”, 原有的类叫做”基类”, 新建立的类叫做”派生类”. 从类的成员角度看, 派生类自动地将 ...
- 原来写个Vue 首页就这么简单
全栈的自我修养: 为我们的项目添加首页 You can never replace anyone. What is lost is lost. 每个人都是无可替代的,失去了便是失去了. 前言 上篇文章 ...
- RNN神经网络模型原理
1. 前言 循环神经网络(recurrent neural network)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络. 传统的机器学习算法非常依赖于人工提取的特征, ...
- Docker入坑指南之EXEC
容器启动之后,如果我们需要进入容器内修改配置,比如mysql修改启动配置 我们启动的附加参数是不是shell,这个时候就可以用docker exec了,docker除了对image参数以外,大部分命令 ...
- Android 布局的一些控件的补充和布局的补充(今儿没课)
前面写的博客可能会有点乱: 1,是不太会排版. 2,就是我一边看书,一边听学长讲课,所以有的知识就融入进去了,我写的都是自己的意见和理解,大家取我精华,弃我糟粕哈. 今天是书上的内容,主要讲布局的,一 ...
- python2.3嵌套if结构:
#案例:存款100万的请款下,买宝马:老爸资助大于50万买宝马740:大于30万买宝马520:小于20万宝马320.存款大于50万小于100万买丰田:大于20万小于50万买二手车:小于20万自行车! ...