创建脚本
创建shell脚本时必须在第一行指定要使用的shell,格式为#! /bin/bash
。#
主要作为注释使用,不会处理shell脚本中的注释行,但shell脚本中的第一行是个例外,#
后面的 !
会告诉shell用哪个shell来运行脚本
用户变量
- 定义:数字,字母,下划线组成,长度不超过20个,区分大小写
- 引用变量使用 $,没有 $, shell会将变量名解释成普通的文本字符串
- 使用等号将值赋给用户变量,变量和等号之间不能出现空格
命令替换
有两种方式可用将命令输出赋给变量:
- 反引号`
- $()格式
用途:可通过命令替换获取当前日期并用它来生成唯一文件名
数学运算
expr 1 + 2
(符号两边的空格时必须的)- bash shell提供了一种更加简单的方法来执行数学表达式:
var=$[1 + 5]
。用方括号执行shell数学运算比用expr
命令方便。在使用方括号来计算时,不用担心shell会误解乘号或其他符号,shell知道它不是通配符,因为在方括号内 - 浮点解决方案:bc
[ ]
和 [[ ]]
- 单个方括号是一个内建命令,双方括号是一个关键字。
- 双方括号提供了更强大的字符串和模式匹配功能。例如,你可以使用
"=="
运算符来进行模式匹配。 - 在双方括号中,可以使用逻辑运算符(&&和||)。在单个方括号中,你必须使用
-a
(表示并)和-o
(表示或)。 - 双方括号中的变量引用可以不被引号括起来,即使变量的值包含空格或特殊字符也不会出错。但在单个方括号中,如果你不使用引号,可能会导致错误。
- 在双方括号中,
"<“
和”>"
是字符串比较运算符。在单个方括号中,它们是重定向运算符,你必须使用"lt"
和"gt"
来进行比较。 - 双方括号支持正则表达式匹配。
比较
- 数值比较,可以用在数字和变量上
- 字符串比较
字符串大小: -n和-z可以检查一个变量是否含有数据(长度是否为0) - 文件比较
双括号
双括号 ((expression )), expression可以是任意的数学赋值或比较表达式,用于整数运算,比如加减乘除、取余等操作。双括号内的表达式都被认为是数学表达式。使用双括号 (( expression ))
退出脚本
- 退出状态码是0到255之间的整数
- 查看退出状态码:
$?
用来保存上个已经执行命令的退出状态码,对于需要检查的命令,必须在其运行完毕后立刻查看或使用$?
变量。 - 一个成功结束的命令的退出状态码是0,如果一个命令结束时有错误,退出状态码就是一个正数值。无效命令会返回一个退出状态码127
- exit命令:默认情况下,shell脚本会以脚本中最后一个命令的退出状态码退出。你可以改变这种行为,返回自己的退出状态码。exit允许你在脚本结束时指定一个退出状态码。可以在exit命令的参数中使用变量
命令汇总
- 输入输出重定向:<, <<, >, >>
- 管道(|):将一个命令的输出作为另一个命令的输入
- 使用多个命令时可以用
;
分隔 - 加载其他脚本使用命令:
source
,类似于py中的import
,如source common.sh
- 显示消息:通过echo命令
- 默认情况下,不需要使用引号将要显示的文本字符串划定出来;
- 可用单引号或双引号来划定文本字符串,如果在字符串中用到了它们,需要在文本中使用其中一种引号,而用另外一个来将字符串划定起来
- 输出信息为两行,如果想输出到同一行,可使用echo的-n参数+字符串两侧使用引号+要显示的字符串尾部要有一个空格:
# 输出为一行
echo The time and date are:
date
# 输出为多行
echo -n "The time and date are "
date
- 转义:使用反斜线
\
echo "The cost of the item is $15"
输出为:The cost of the item is 5,因为在引号中出现$
,就会以为在引用一个变量,脚本会尝试显示$1
,再显示数字,要显示美元符需要使用反斜线转义:echo “The cost of the item is \$15
- test 命令是一个内建命令,用于检查某个条件是否成立,然后根据检查结果返回一个退出状态码。test 命令的另一个等效形式是方括号
[ ]
。
脚本验证
- 使用shell的"-n"或"–noexec"选项来检查脚本的语法,但不实际执行它。检查"myscript.sh"脚本的语法,但不会执行脚本中的任何命令。如果脚本中有语法错误,bash会打印错误消息。
bash -n myscript.sh
- 使用shell的"-v"或"–verbose"选项来打印脚本中的每个命令,但不执行它们。这将打印脚本中的每个命令,让你看到脚本将要做什么,但不会实际执行这些命令。
bash -v myscript.sh
- 使用shell的"-x"或"–xtrace"选项来打印脚本中的每个命令,以及它们的输出结果。这将打印脚本中的每个命令,以及它们的输出结果,让你看到脚本是如何工作的。
bash -x myscript.sh
这些选项都是在命令行中使用的,而不是在脚本中。如果你想在脚本中使用这些选项,你需要在脚本的开头添加相应的"set"命令。例如,"set -n"会让脚本在检查语法后停止运行,"set -v"会让脚本打印每个命令,"set -x"会让脚本打印每个命令和它们的结果。