Shell
简介
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
常见的编译器
- Bourne Shell -
/usr/bin/sh
、/bin/sh
- Bourne Again Shell -
/bin/bash
- C Shell -
/usr/bin/csh
- K Shell -
/usr/bin/ksh
- Shell for Root -
sbin/sh
Shell bash 和 sh 的主要区别
sh 遵循 POSIX 规范:“当某行代码出错时,不继续往下解释”。bash 就算出错,也会继续向下执行。
sh 跟 bash 的区别,实际上是 bash 有没开启 POSIX 模式的区别。
简单说,sh 是 bash 的一种特殊的模式,sh 就是开启了 POSIX 标准的 bash, /bin/sh 相当于 /bin/bash --posix。
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX )。
POSIX 标准意在期望获得源代码级别的软件可移植性。换句话说,为一个 POSIX 兼容的操作系统编写的程序,应该可以在任何其它的 POSIX 操作系统上编译执行。
执行.sh 脚本的方式
作为可执行程序
./test.sh
作为解释器参数
/bin/sh test.sh
/bin/python test.py直接用 sh(这种办法不需要文件具备可执行的权限也可运行)
sh ./test.sh
环境变量
变量名 | 说明 |
---|---|
${0} | 文件名称 |
${?} | 返回上一个命令执行状态返回值: 0 表示成功, 1 表示执行结果, 2 表示程序状态返回码(0-255)系统预留错误(1,2,127) |
$# | 表示参数的个数 |
$\*或者 $@ | 表示参数列表(区别:前者将所有参数组成一个字符串,后者分开的字符串) |
$$ | 获取当前 shell 进程 ID |
$! | 表示执行上一个指令的 PID(进程 ID) |
基础语法
指定解析器
#!/bin/sh
#!/bin/bash
#!/bin/python
变量声明与使用
var = "xxxx"
echo "A is ${var}"
只读变量
var = "xxx"
# 此时将变量设置为只读
readonly var
作用于
# 本地变量,作用域:整个bash进程可以使用
name="ccvb"
# 局部变量,作用域:当前代码段(修饰符local)
local name="ccvb"
# 环境变量,作用域:当前shell进程以及子进程
export name="ccvb"
# 传参
name=${1}
age=${2}
sex=${3}
echo "姓名:${name}, 年龄 ${age}, 性别 ${sex}"
接受输入
read varName
echo "user intpu: "$varName
字符串使用
定义
var_name="ccvb"
var_name='ccvb'
获取长度
语法:${#变量名}
export var_name="ccvb"
echo ${#var_name} # 4
拼接
语法:
info=${name}${age}${sex}
info="${name},${age},${sex}"
字符串截取
语法:${变量名:开始位置:截取位置}
export var_name="ccvb"
cc=${var_name:0:2}
echo ${cc} # cc
删除字符串
删除到指定位置(不包含该位置)
语法:${变量名#删除字符串 正则表达式}
#删除头字符 只能删除从头开始的
name="I am Andy"
result=${name#I}
echo $result # 结果am Andy
#查找制定字符,并删除前面所有字符(包含自己)
name="I am Andy"
result=${name#*A}
echo $result # 结果ndy
#删除制定范围(只能从第一个开始删除,删除到那里)
name="I am Andy"
result=${name#I*A}
echo $result # 结果ndy
删除到指定位置(包含该位置)
语法:${变量名##删除字符串 正则表达式}
name="I am Andy"
result=${name##*A}
echo $result # 结果ndy
从字符串结尾开始匹配,删除匹配的字符串:
语法:${变量名%删除字符串 正则表达式}
name="I am Andy"
result=${name%Andy}
echo $result # I am (5位)
#查找自定字符第一个,并删除前面所有字符(包含自己)
name="I am Andy"
result=${name%A*}
echo $result # 结果 I am (5位)
流程控制
if 语法
if command; then
.../
else
.../
fi
布尔运算
- 不等于
"!="
- 或运算
"-o"
- 与运算
"-a"
if [ $a != $b ]; then
逻辑运算
逻辑且"&&"
if [ $a -lt 200 ] && [ $b -gt 200 ]