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