Shell是什么?
什么是shell?
定义:shell是一个命令解释器
shell位于操作系统和应用程序之间,是他们二者的接口,负责:把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
一句话:shell就是在操作系统和应用程序之间的一个命令翻译工具。
shell的分类
1.图形界面shell,桌面就是一个图形界面shell
2.命令行shell,如:linux系统下的bash
查看系统shell信息
echo $SHELL:查看当前系统shell版本
cat /etc/shells:查看系统兼容支持的其他版本
shell脚本
定义:可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们将这个文件为shell脚本(可执行命令的组合)。
示例:
创建脚本文件,并写入内容:vim 001.sh (sh结尾,给程序员看的)
1 #!/bin/bash
2
3 echo 'shell hello'
执行:bash 001.sh
注释:
单行注释:#空格...
多行注释:<<临时字符 注释内容 临时字符(临时字符尽量不要使用汉字)
shell的优劣势
优势:存在时间长,拥有较多累积(诞生早),编写简单,对环境依赖小
劣势:无法实现复杂功能,不支持现代编程语言的高级特性:面向对象等
执行shell脚本
1、bash 脚本文件名(先启动子进程名字叫bash,在子进程中执行脚本内容,解释器:bash)
2、.空格/脚本文件名 (先启动子进程名字叫脚本名,在子进程中执行脚本内容,解释器:#!指定的解释器,即系统缺省shell)
3、source 脚本名(直接在当前shell执行脚本内容,解释器:当前shell)
注意:创建了子进程,不能使用当前终端定义的变量,使用source不会开子进程,能使用当前终端定义的变量
变量
普通变量
定义方式:变量名="变量值",习惯:数字不加引号,其它加双引号(可以变量套变量,如:b=777
a="123$b") 执行结果:a=123777
命令变量(命令的输出作为变量值赋给变量名)
变量名=`命令`(注意:`是反引号)
变量名=$(命令)
注意:命令变量的值在定义时确定
变量访问
1 $变量名
2 "$变量名" (保证变量值是字符串)
3 ${变量名} (限定变量名范围)
4 "${变量名}" (推荐使用)
删除变量:unset 变量名,修改字符编码:unset LANG
变量分类
1.本地变量:哪里定义哪里访问
2.全局变量:在当前系统的所有环境下都能生效的变量(每个终端就是一个shell环境,开启子进程的shell为子shell环境)
查看全局变量:env
定义全局变量:export 变量名=值(最常用)
自定义全局变量生效范围:只对当前shell环境及子shell环境有效,shell退出后全局变量消失
定义系统级全局变量:修改~/.bashrc后,直接打开新的终端
3.内置变量
符号 | 意义 |
---|---|
$0 | 获取当前执行的shell脚本文件名 |
$$ | 获取执行shell脚本的进程号 |
$n | 获取当前执行的shell脚本命令之后的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10},如:ls -l 当前命令的参数为-l |
$# | 获取当前shell命令行中参数的总个数 |
$? | 获取执行上一个指令的返回值(0为成功,非0为失败) |
字符串截取
格式:${变量名:起始位置:截取长度}
${变量名:0:5} 从第1个字符开始,截取5个字符
${变量名:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
默认值
${变量名:-默认值}:若变量存在则输出变量值。否则输出默认值
${变量名:+提示信息}:若变量存在则输出提示信息,否则,啥都不输出
表达式
1 测试语句:条件成立,状态返回值是0,条件不成立,状态返回值是1
test 条件
[ 条件 ] (方括号内左右各有一个空格)
1 数值比较:
n1 -eq n2 相等、-gt大于、-ge大于等于、-lt小于、-le小于等于、-ne不等于
2 字符串比较
== != 、比较操作符左右各有一个空格
2 逻辑表达式
命令1 && 命令2 (1成功则执行2)
命令1 || 命令2 (1失败则执行2,1执行成功,那么不执行命令2)
3 文件表达式
-f 判断是否是文件
输入:[ -f weizhi.sh ] && echo "是一个文件"
输出:是一个文件
-d 判断是否是目录
-x 判断是否可执行 (一般,目录也是可执行的)
4 计算表达式(支持整数运算)
$((计算过程))
let 等式
注意:$(())中只能用+-*/和()运算符,表达式必须是一个整体,中间不能出现空格等特殊字符
常见符号
>:将左侧的内容以覆盖的方式输入到右侧
>>:追加
1 分别重定向:bash 5-chongdingxiang.sh > res.log 2>err.log
2 合并重定向:bash 5-chongdingxiang.sh > res.log 2>&1
3 丢弃:bash 5-chongdingxiang.sh > /dev/null 2>&1
注意:标准输出(standard output):程序正确运行时的输出,标准错误(standard err):程序异常时的输出
管道符|
使用格式: 命令1 | 命令2
管道符左侧命令1执行后的结果作为输入传递给右侧的命令2使用