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 ...
随机推荐
- PHP lstat() 函数
定义和用法 lstat() 函数返回关于文件或符号连接的信息. 该函数将返回一个包含下列元素的数组: [0] 或 [dev] - 设备编号 [1] 或 [ino] - inode 编号 [2] 或 [ ...
- Skill 脚本演示 ycBusNet.il
https://www.cnblogs.com/yeungchie/ ycBusNet.il 用于原理图中按照一定格式,批量创建 Bus . 回到目录
- Jdbc与Dao和Javabean的区别
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/yarn/exceptions/YarnException
这个是Flink 1.11.1 使用yarn-session 出现的错误:原因是在Flink1.11 之后不再提供flink-shaded-hadoop-*” jars 需要在yarn-sessio ...
- 001_HyperLedger Fabric环境安装
HyperLedger Fabric的环境,有解决三大问题 第一,是系统环境,这里我们选择的是centos7 第二,是开发环境,这里我们选择的是Go语言 第三,是运行环境,这里我们选择的是Docker ...
- 微信公众号添加zip
微信公众号添加zip的教程 我们都知道创建一个微信公众号,在公众号中发布一些文章是非常简单的,但公众号添加附件下载的功能却被限制,如今可以使用小程序“微附件”进行在公众号中添加附件. 以下是公众号添加 ...
- C#/.Net集成RabbitMQ
RabbitMQ简介 消息 (Message) 是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串. JSON 等,也可以很复杂,比如内嵌对象. 消息队列中间件 (Message Queu ...
- 用Java制作斗地主
首先,按照斗地主规则,完成洗牌发牌的动作.如图: 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌. 4. 查看三人各 ...
- 某大型企业ospf面试题分析(含路由策略和路由过滤,及双点双向重发布)
面试问题背景 本面试题来自国内最大通信技术公司之一,央企,有很多金融网项目. 了解行业的同学,一定知道事哪个企业. 上面试问题(取自百哥收集整理的面试总结大全,关注百哥CSDN或知乎,不定期分享名企面 ...
- 2020-04-24:Object obj = new Object()这句话在内存里占用了多少内存
福哥答案2020-04-25:这道题最好把对象和变量分开说明,否则容易产生误解.以下都是64位环境下.针对对象:压缩状态:MarkWord 8+klass 4+数据0+对齐4=16非压缩状态:Mark ...