格式 {#格式}
打开文本编辑器(如vi或vim ),创建一个后缀名为 sh
的文件;开头第一行提示Shell使用的解释器类型,如 #!/bin/bash
,为保证解析正确建议写上。
例如编写一个名为 test.sh
的脚本:
|-------------|---------------------------------------------------|
| 1 2
| #!/bin/bash echo "test" #echo命令用于输出(打印)信息
|
使用方式 {#使用方式}
bash
或 sh
+ 脚本名运行 {#bash或sh-脚本名运行}
|---------------------|---------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| [kaka@localhost ~]$ cat test.sh a= 'hello world' echo $a [kaka@localhost ~]$ bash test.sh hello world
|
给执行权限后直接运行 {#给执行权限后直接运行}
直接运行前需要为脚本赋予执行权限(
chmod +x <脚本的文件名>
)
|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10
| [kaka@localhost ~]$ cat test.sh a= 'hello world' echo $a [kaka@localhost ~]$ ./test.sh bash: ./test.sh: 权限不够 [kaka@localhost ~]$ chmod +x test.sh [kaka@localhost ~]$ ./test.sh hello world
|
使用 source
或 .
运行 {#使用-source-或-运行}
使用
source
相当于在当前终端运行该脚本,可以看到被赋值的变量显示在当前终端上。
|---------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13
| [kaka@localhost ~]$ cat a.sh #!/bin/bash A=5 echo $A [kaka@localhost ~]$ bash a.sh 5 [kaka@localhost ~]$ echo $A [kaka@localhost ~]$ source a.sh 5 [kaka@localhost ~]$ echo $A 5
|
变量 {#变量}
自定义变量、环境变量、位置变量、预定义变量
变量名要求
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线
_
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
如何使用
在变量名前加美元符号(
$
)即可为了帮助解释器识别到变量的边界,可以在变量名外加入花括号(
{}
)
自定义变量 {#自定义变量}
相当于局部变量,仅在当前会话中生效
格式: <变量名>=<变量值>
,注意 等号两边不需要空格
如果变量值存在空格,需要用双引号( ""
)或单引号( ''
)框起来
使用 unset <变量名>
撤销该自定义变量
环境变量 {#环境变量}
相当于全局变量,在所有会话中生效
例如 /etc/profile
文件存储着当前系统的环境变量
预定义变量 {#预定义变量}
也称为特殊变量;这其中一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
| 变量 | 含义 |
|:---:|:----------------------------------------------------------------------------:|
| $n | 位置变量 n
为数字, $0
代表该脚本名称 $1
代表第1个参数(以此类推),但从第十个开始要用花括号( {}
)包含 |
| $# | 获取所有输入参数的个数 |
| $* | 获取命令行的所有参数,并将其 视为一个整体 |
| $@ | 获取命令行的所有参数,但 将每个参数进行拆分 |
| $? | 获取最后一次命令执行的状态,正确执行为 0
,其余输出则不正常 |
创建一个名为 advance.sh
的文件,并写入以下内容
|---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # !/bin/bash echo '==========$n==========' echo $0 echo $1 echo $2 echo '==========$#==========' echo $# echo '==========$*==========' for i in "$*"; do echo $i done echo '==========$@==========' for i in "$@"; do echo $i done echo '==========$?==========' echo $?
|
使用 . advance.sh 1 2 3 4 5
命令,结果如下
|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ==========$n========== ./advance.sh 1 2 ==========$#========== 5 ==========$*========== 1 2 3 4 5 ==========$@========== 1 2 3 4 5 ==========$?========== 0
|
只读变量 {#只读变量}
使用 readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变、不能被撤销
赋值 {#赋值}
显示 变量的值 使用 双引号
单引号 中是 没有变量 的
反引号(``)等价于 $() , 反引号的Shell命令会被先执行
直接赋值 {#直接赋值}
格式: <变量名>=<变量值>
,注意 等号两边不需要空格
|---------------|------------------------------------------------|
| 1 2 3
| # !/bin/bash num=10086 #直接赋值 echo $num
|
键盘读取赋值 {#键盘读取赋值}
格式: read -p ["提示信息"] [变量名]
,可不带 -p ["提示信息"]
这个选项和参数
获取输入的单行数据,并赋值给变量名
|---------------|--------------------------------------------------------------------|
| 1 2 3
| # !/bin/bash read INPUT #将键盘输入的单行数据赋值给INPUT变量名 echo $INPUT
|
通过命令行参数赋值 {#通过命令行参数赋值}
即通过 位置变量 进行调用
|-------------|---------------------------------|
| 1 2
| # !/bin/bash echo $1 $2
|
利用命令的输出结果赋值 {#利用命令的输出结果赋值}
在赋值语句中使用反向单引号( ``)
|---------------|------------------------------------------------------------------------|
| 1 2 3
| # !/bin/bash DATE=`date +%F` #将当前年月日期(结果)赋值到DATE变量上 echo $DATE
|
其中 date +%F
等价于 $(date +%F)
从文件中读取数据赋值 {#从文件中读取数据赋值}
这种方式适用于处理大批量的数据,直接把相应的数据写入文件中。这种方式通常是循环一行行读入数据,即每循环一次,就从文件中读入一行数据,知道文件的结尾。
|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| # !/bin/bash ls *.sh > execfile #列举后缀名为sh的文件重定向至execfile while read LINE #使用While循环读取每一行,并赋值到LINE这个变量中 do echo $LINE #输出每行内容 done < execfile
|
运算符 {#运算符}
在bash中,变量的默认均为 字符串 类型,无法直接进行运算
基本语法 {#基本语法}
"$((运算式))"
或 "$[运算式]"
|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5
| [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ sum =$(( $a + $b )) #或 sum=$[$a+$b] [kaka@localhost ~]$ echo $sum 30
|
使用expr计算 {#使用expr计算}
expr
是一款表达式计算工具,使用它能完成表达式的求值操作。
|-----------------|-----------------------------------------------------------------------------------------------|
| 1 2 3 4
| [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ expr $a + $b 30
|
使用let计算 {#使用let计算}
|-------------------|-----------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5
| [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ let sum =a+b [kaka@localhost ~]$ echo $sum 30
|
算数运算符 {#算数运算符}
| 运算符 | 说明 | 举例 |
|:---:|:------------------------:|:----------------------------------:|
| + | 加法 | expr $a + $b
|
| - | 减法 | expr $a - $b
|
| * | 乘法 | expr $a \* $b
此处需要用 \
以防转译 |
| / | 除法 | expr $b / $a
|
| % | 取余 | expr $b % $a
|
| = | 赋值 | a=$b
把变量 b 的值赋给 a |
| == | 相等 用于比较两个数字,相同则返回 true | [$a == $b]
|
| != | 不相等 用于比较两个数字,不相同则返回 true | [$a != $b]
|
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]
是错误的,必须写成 [$a == $b]
。
替删改 {#替删改}
替换 {#替换}
| 语法 | 含义 | |:-----------------:|:---------------:| | ${变量名/旧字符串/新字符串} | 将第一个旧字符串替换成新字符串 | | ${变量名//旧字符串/新字符串} | 将全部的旧字符串替换成新字符串 |
例如将 www.abc.com
中的第一个 a
替换成 d
|-------------|------------------------------------------|
| 1 2
| var=www.abca.com echo ${var/a/d}
|
例如将 114514
中的 1
全部替换成 9
|-------------|-------------------------------------|
| 1 2
| num=114514 echo ${num//1/9}
|
删除 {#删除}
| 语法 | 含义 |
|:--------------------------:|:-----------------------:|
| ${ 变量名
# 关键字符
} | 删除第一个关键字符前面的内容(从前往后匹配) |
| $[ 变量名
## 关键字符
] | 删除最后一个关键字符前面的内容(从前往后匹配) |
| $[ 变量名
% 关键字符
] | 删除第一个关键字符后面的内容(从后往前匹配) |
| $[ 变量名
%% 关键字符
] | 删除最后一个关键字符后面的内容(从后往前匹配) |
创建一个名为 del.sh
的文件,并写入以下内容
|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| file=/dir1/dir2/abc.file echo "输出名为file变量" echo ${file} echo '删除第一个 / 前面的内容(从前往后匹配)' echo ${file#*/} echo "删除最后一个 / 前面的内容(从前往后匹配)" echo ${file##*/} echo "删除第一个 / 后面的内容(从后往前匹配)" echo ${file%/*} echo "删除最后一个 / 后面的内容(从后往前匹配)" echo ${file%%/*}
|
执行结果
|---------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9
| 输出名为file变量 /dir1/dir2/abc.file 删除第一个 / 前面的内容(从前往后匹配) dir1/dir2/abc.file 删除最后一个 / 前面的内容(从前往后匹配) abc.file 删除第一个 / 后面的内容(从后往前匹配) /dir1/dir2 删除最后一个 / 后面的内容(从后往前匹配)
|
修改 {#修改}
使用 ${变量名-新的变量名}
进行替换
|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| [kaka@localhost ~]$ unset num [kaka@localhost ~]$ echo ${num-1919} 1919 [kaka@localhost ~]$ num=10010 [kaka@localhost ~]$ echo ${num-1919} 10010
|