shell 构建基础脚本

构建基础脚本


使用多个命令

如果想让两个命令一起运行,可以将其放在同一行中,彼此用分号隔开

date ; who

创建shell脚本文件

在创建 shell 脚本文件时,必须在文件的第一行指定要使用的 shell,格式如下:

#!/bin/bash 

#后面的惊叹号会告诉 shell 用哪个 shell 来运行脚本

在指明了 shell 之后,可以在文件的各行输入命令,每行末尾加一个换行符。之前提到过, 注释可用#添加

显示消息

显示日期和登录的用户

#!/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

使用变量

环境变量

#!/bin/bash
# display user information from the system

echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME

用户自定义变量

#!/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"

将一个变量赋值给另一个变量

#!/bin/bash
# assigning a variable value to another variable

value1=10
value2=$value1
echo The resulting value is $value2

命令替换

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

  • 反引号`
  • $( )格式

执行命令替换符内的命令

#!/bin/bash
# Execute the command in the command substitution character

# testing=`date`
testing=$(date)
echo "The date and time are: " $testing

重定向输入和输出

输出重定向:bash shell 使用大于号(>)来实现该操作

#!/bin/bash
# command > outputfile

date > t.txt

输入重定向:输入重定向运算符是小于号(<)

#!/bin/bash
# command < inputfile

wc < t.txt

管道

bash shell 使用 | 来实现该操作

command1 | command2

可别以为由管道串联起的两个命令会依次执行。实际上,Linux 系统会同时运行这两个命令, 在系统内部将二者连接起来。当第一个命令产生输出时,它会被立即传给第二个命令。数据传输 不会用到任何中间文件或缓冲区。

执行数学运算

运算符描述
ARG1 |ARG2如果 ARG1 既不为 null 也不为 0,就返回 ARG1;否则,返回 ARG2
ARG1 & ARG2如果 ARG1 和 ARG2 都不为 null 或 0,就返回 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返回 CHARS 在字符串 STRING 中所处的位置;否则,返回 0
length STRING返回字符串 STRING 的长度
+ TOKEN将 TOKEN 解释成字符串,即使 TOKEN 属于关键字
(EXPRESSION)返回 EXPRESSION 的值

expr命令

#!/bin/bash
# An example of using the expr command

var1=10
var2=20
var3=$(expr $var2 / $var1)
echo The result is $var3

使用方括号

#!/bin/bash
# Using square brackets to perform mathematical operations is much more convenient than using the expr command

var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4

浮点数解决方案

#!/bin/bash
# Use BC to handle floating point numbers in the script

var1=20
var2=3.14159
var3=$(echo "scale=4; $var1 * $var1" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo The final result is $var4

bc输入重定向处理更多字符

#!/bin/bash
# BC input redirection handles more characters

var1=10.46
var2=43.67
var3=33.2
var4=71

var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)

退出脚本

状态码描述
0命令成功结束
1一般性未知错误
2不适合的 shell 命令
126命令无法执行
127没找到命令
128无效的退出参数
128+x与 Linux 信号 x 相关的严重错误
130通过 Ctrl+C 终止的命令
255正常范围之外的退出状态码
#!/bin/bash
# testing the exit status

var1=10
var2=30
var3=$[ $var1 * var2 ]
echo The value is $var3
exit $var3

实战

计算两个日期之间的天数

#!/bin/bash
# calculate the number of days between two dates

date1="Jan 1, 2020"
date2="May 1, 2020"

time1=$(date -v "$date1" +%s)
time2=$(date -v "$date2" +%s)

diff=$(expr $time2 - $time1)
secondsinday=$(expr 24 \* 60 \* 60)
days=$(expr $diff / $secondsinday)

echo "The difference between $date2 and $date1 is $days days"

小结

bash shell 脚本允许将多个字符串命令依次放入脚本。创建脚本的最基本方式是将命令行中 的多个命令以分号隔开。shell 会按顺序逐个执行命令,在屏幕上显示每个命令的输出。

你也可以创建一个 shell 脚本文件,将多个命令放进去,让 shell 依次执行。shell 脚本文件必 须定义用于运行该脚本的 shell。这可以通过#!符号在脚本文件的第一行指定,随后跟上 shell 的 完整路径。

在 shell 脚本内,你既可以在变量名前使用美元符号来引用环境变量,也可以定义自己的变 量并对其赋值,甚至还可以通过反引号或$()获取命令的输出。

bash shell 允许重定向命令的标准输入和标准输出。你可以使用大于号以及文件名将命令输 出从屏幕重定向到该文件中。你也可以使用双大于号将输出数据追加到已有文件。小于号则用来 重定向命令输入,比如将命令输入重定向到文件。

Linux 管道命令(断条符号)允许将命令的输出直接传给另一个命令。Linux 系统会同时运 行这两个命令,将第一个命令的输出作为第二个命令的输入,不借助任何中间文件。

bash shell 提供了两种方式以在 shell 脚本中执行数学运算。expr 命令是一种执行整数运算的 简便方法。在 bash shell 中,也可以通过将美元符号放在由方括号包围的表达式之前来执行基础 数学运算。对于浮点数运算,要用到 bc 命令,将内联数据重定向到输入,然后将输出保存到用 户自定义变量中。

最后,本章讨论了如何在 shell 脚本中使用退出状态码。shell 中运行的每个命令都会产生一 个退出状态码,这是 0~255 的一个整数值,表明命令是否成功执行,如果没有成功,可能的原 因是什么。退出状态码 0 表明命令成功执行。你可以在 shell 脚本中用 exit 命令来指定脚本完 成时的退出状态码。

到目前为止,shell 脚本中的命令都是按照有序的方式一个接着一个执行。第 12 章将介绍如 何用一些逻辑流程控制来更改命令的执行次序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值