Skip to main content

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 脚本的方式

  1. 作为可执行程序

    ./test.sh
  2. 作为解释器参数

    /bin/sh test.sh
    /bin/python test.py
  3. 直接用 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 ]