Shell 基础
Shell是一个C语言编写的脚本语言,用户输入命令交给Shell处理,Shell将相应的操作传递给内核(Kernel),内核把处理的结果输出给用户。
Shell 两大分类
1、图形界面Shell(GUI Shell)
GUI 为 Unix 或类 Unix 操作系统构造一个功能完善,操作简单以及界面友好的桌面环境;主流桌面有 KDE、Gnome 等…
2、命令行界面Shell(GLI Shell)
GLI 是在用户提示符下输入可执行指令的界面,在 Linux 系统上主流的 CLI 实现是 Bash
Shell 脚本
vim shell.sh
#!/bin/bash
echo 'Hello world'
执行脚本四种方法
1、bash 解释器
bash shell.sh
Hello world
2、sh 命令执行
sh shell.sh
Hello world
3、source 命令执行
source shell.sh
Hello world
#缩写
. shell.sh
Hello world
4、添加执行权限
chmod +x shell.sh
./shell.sh
Hello world
sh bash source 区别
1、sh
打开一个 subshell 去读取、执行脚本,不需要有 执行权限
sh 是Linux 中运行 shell 的命令,是 shell 的解释器
2、bash
打开一个 subshell 去读取,执行脚本不需要有 执行权限
3、source
在 当前shell内 去读取、执行脚本 不需要有 执行权限
source 方式运行脚本时,就是让脚本在当前process内执行,而不是产生一个 child process
来执行;由于所有执行结果均于当前 process 内执行,若脚本的环境有所改变,也会改变当前 process 环境
Shell 变量
变量命名注意事项
1、变量名和等号之间不能有空格
2、命名只能以数字、字母、下划线组成;数字不能开头
3、不能使用标点符号;不能使用关键字
4、变量命名长度不能超过20
5、变量命名区分大小写
变量类型
局部变量
局部变量定义在shell脚本或命令中,只能在当前实例中有效,不能被其他shell启动的程序访问
环境变量
所有程序都可以访问环境变量;shell脚本中也可以自己定义环境变量
系统变量
$SHELL | 默认shell |
$HOME | 当前用户家目录 |
$LANG | 默认语言 |
$PATH | 默认可执行程序路径 |
$PWD | 当前路径 |
$UID | 当前用户 ID |
$USER | 当前用户 |
$HISTSIZE | 历史命令大小 |
$RANDOM | 随机生成一个2-32767的整数 |
$HOSTNAME | 主机名 |
单引号双引号
单引号
www=123
echo '$www 123'
$www 123
单引号可以让字符原样输出
双引号
www=123
echo "$www 123"
123 123
双引号可以解释特殊符号
Shell 字符串
获取字符串长度
str='hello world'
echo ${#str[@]}
11
字符串切片
#截取前五个字符 含头不含尾
str='hello world'
echo ${str:0:5}
hello
#截取后五个字符
str='hello world'
echo ${str:(-5)}
world
#截取从倒数五位后的五位 包括倒数第五位
str='hello world'
echo ${str:(-5):5}
world
字符串替换
“/” 但斜杠表示只替换正则匹配到的第一个字符 “//” 双斜杠表示替换正则匹配到的所有字符
#不改变原字符串
str='hello world'
echo ${str/hello/HELLO}
HELLO world
#正则匹配替换
str='hello world 123'
echo ${str/[0-9]/w}
hello world w23
str='hello world 123'
echo ${str//[0-9]/w}
hello world w
字符串截取
“#” 去掉左边,最短匹配模式;“##” 最长匹配模式
URL="http://www.baidu.com/baike/user.html"
echo ${URL#*.}
baidu.com/baike/user.html
URL="http://www.baidu.com/baike/user.html"
echo ${URL##*.}
html
“%” 去掉右边,最短匹配模式;“%%” 最长匹配模式
URL="http://www.baidu.com/baike/user.html"
echo ${URL%.*}
baidu.com/baike/user.html
URL="http://www.baidu.com/baike/user.html"
echo ${URL%%.*}
http://wwww
变量状态赋值
${VAR:-'string'} #如果 VAR 变量为空则返回string
${VAR:+'string'} #如果 VAR 变量不为空则返回string
${VAR:='string'} #如果 VAR 变量为空则将 string 赋值给 VAR
${VAR:?'string'} #如果 VAR 为空则将 string 输出到命令行
VAR=
echo ${VAR:-'VAR为空'}
VAR为空
VAR=123
echo ${VAR:+'VAR不为空'}
VAR不为空
VAR=
echo ${VAR:='VAR为空赋值'}
VAR为空赋值
VAR=
echo ${VAR:='VAR为空'}
-bash: VAR: VAR为空