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万自行车! ... 
