Shell基础
Shell基础
shell是一个命令行解释器,用于接收用户(应用程序)命令来调用系统内核。
脚本格式:以
#!/bin/bash
开头(指定解析器)执行方式:
1.bash/sh + 绝对路径(相对路径)
2.绝对路径(相对路径)
需要可执行(x)权限
3.source + 绝对路径(相对路径)
: 在当前的shell下执行
子shell:在子shell中设置的当前的环境变量,对于父shell不可见
1.变量
1.1 常用系统变量
常用系统变量:$HOME、$PWD、$USR、$SHELL、$PATH
env
: 列出当前 shell 的所有环境变量
set
: 显示所有 shell 变量(包括环境变量和局部变量)
printenv+环境变量名
: 输出某个环境变量的值
$PATH
: 保存了搜索系统命令的路径(/usr/bin
)
1.2 自定义变量
自定义变量(局部变量):变量名=变量值
(等号前后不能有空格)
局部变量导出为全局变量:export + 变量名
注:在子shell中修改全局变量对父shell不可见
只读变量:readonly 变量名=变量值
撤销变量:unset + 变量名
注1:在bash中,变量默认的类型都是字符串类型,无法直接进行数值计算。
注2:只读变量不能unset。
1.3 特殊变量
$n
: n为数字,$0
代表脚本名称,$1
-$9
代表第一到第九个参数,十个以上使用{}
,如${10}
。$#
: 获取所有输入参数的个数,常用于循环,判断参数的个数是否正确。$*
: 获取命令行中的所有参数,并将其看成一个整体$@
: 获取命令行中的所有参数,将其看作一个集合$?
: 获取上一个命令的返回状态,返回0表示正常结束
2.运算
2.1 运算符
语法格式:$((运算式))
或$[运算式]
注:(( ))中可用使用数学表达式进行运算
使用expr: a=$(expr 5 \* 2)
2.2 条件判断
test +判断条件
:test $a = 2
[ 判断条件 ]
: “[ ]”前后要有空格
判断条件:
eg:
1 | 判断test文件是否有读的权限 |
“[ ]”中的逻辑条件连接使用:-a
(and)和-o
(or)
2.3 流程控制
if判断
单分支:
1
2
3if [ 条件判断 ];then
程序
fi双分支:
1
2
3
4
5if [ 条件判断 ];then
程序1
else
程序2
fi多分支:
1
2
3
4
5
6
7
8
9if [ 条件判断1 ]
then
程序1
elif [ 条件判断2 ]
then
程序2
else
程序3
fi
for循环
用法一:
1 | for (( 初始值;循环控制条件;变量变化 )) |
eg:
1 | !/bin/bash |
用法二:
1 | for 变量 in 值1 值2 值3... |
1 | !/bin/bash |
while循环
1 | while [条件判断式] |
2.4 Read读取控制台的输入
1 | !/bin/bash |
2.5 函数
系统函数
data +%s
: 输出时间戳
basename 路径 [后缀]
: 用于从文件路径中提取文件名或目录名,去除路径前缀和后缀
dirname 路径
: 用于从文件路径中提取目录部分,即去掉文件名,返回路径的父目录。
自定义函数
1 | function 函数名() { |
1 | !/bin/bash |
注:不使用$?
接受返回值,$?
接收的范围为[0~255]
2.6 正则表达式
常规匹配: 匹配常规字符”xxxx”
1
cat /etc/passwd | grep xxxx
模糊匹配:
^
: 匹配一行的开头1
2匹配所有以a开头的行
cat /etc/passwd |grep ^a$
: 匹配一行的结束1
2匹配所有以a结束的行
cat /etc/passwd |grep a$.
: 匹配任意的字符1
2匹配所有r..t的行
cat /etc/passwd |grep r..t*
: 不单独使用,与上一个字符连用,表示匹配上个字符的0次或多次1
2匹配rt,rot,root,rooot等所有行
cat /etc/passwd |grep ro*t
1 | 匹配以a开头,bash结尾,中间为任意字符的所有行 |
[ ]
: 匹配某个范围内的字符