基本

脚本开头

指定解析器

  1. #!/bin/bash

脚本注释

Bash 只支持单行注释,使用#开头的都被当作注释语句

  1. #整行注释
  2. echo hello world #行尾注释

通过 Bash 的一些特性,可以取巧实现多行注释,但是不可取,个人建议老老实实用#;嫌麻烦可以好好学学 vim,熟练以后操作起来快得很。

数据类型

Bash 中基本数据类型只有字符串,连数值类型都没有,declare -i可强制声明数值类型。

  1. #都是字符串
  2. echo abcd
  3. echo 1234

字符串联

Bash 中字符串的串联操作不需要任何操作符,直接将两段数据连接在一起。

  1. echo 123 456
  2. echo 'abc'"def"

变量

系统变量

$HOME、$PWD、$SHELL、$USER 等
set 显示所有变量

特殊变量

$n:n 为数字,0 为命令本身,1-9 依次参数,大于 10 用${10}表示
$#:输入参数的个数
$*:所有参数,看成一个整体
$@:所有参数,区分对待
$? :返回最后一次命令执行状态,0 成功,非 0 失败

自定变量

直接赋值,变量名=值,不要有空格,unset 撤销
申明静态变量:readonly 变量名=值,无法撤销
全局变量:export 变量名

运算符

基本语法

$((运算式))或者$[运算式]
expr +,-,\*,/,%(加,减,乘,除,取余),运算符间要有空格
&&:逻辑与,前一个成功才执行下一个
||:逻辑或,前一个失败才执行下一个

条件判断

[ 条件 ],前后都要有空格

判断条件

整数比较

=
-lt(less than):小于
-le(less equal):小于等于
-eq(equal):等于
-gt(greater than):大于
-ge(greater equal):大于等于
-ne(Not requal):不等于

文件权限

-r(read):读取
-w(write):写入
-x(execute):执行

文件类型

-f(file):文件存在且为常规文件
-e(existence):文件存在
-d(directory):文件存在且为目录

流程控制

if

  1. if [ 条件判断 ]:then
  2. 程序
  3. fi
  4. if [ 条件判断 ]
  5. then
  6. 程序
  7. fi

case

  1. case $变量名 in
  2. "值1")
  3. 程序
  4. ;;
  5. "值2")
  6. 程序
  7. ;;
  8. *)
  9. 程序
  10. ;;
  11. esac

for

  1. for((初始值;循环条件;变量变化))
  2. do
  3. 程序
  4. done
  1. for 变量 in 1 2 3 ...
  2. do
  3. 程序
  4. done

while

  1. while [ 条件判断 ]
  2. do
  3. 程序
  4. done

输入

read(选项)(参数)

选项

-p:指定读取值的提示符
-t:指定读取值的倒计时

参数

变量:指定读取值的变量名

函数

系统函数

basename [string / pathname] [suffix]:删除最后一个/的所有前缀,还可以指定删除suffix后缀
dirname 文件绝对路径:去除文件名,返回剩下的路径

自定函数

  1. function 函数名()
  2. {
  3. Action;
  4. &?或者return int0-255);
  5. }
  6. 函数名

工具

cut

cut [选项] filename:剪切数据
-f:列号,提取第几列
-d:分隔符,按指定分隔符分割列,默认为制表符

sed

sed [选项] ‘命令’ filename:按行依次执行,结果打印到屏幕,不改变文件内容,除非重定向存储输出
-e
-i:直接修改文件
a:新增
d:删除
s:查找并替换

  1. sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

awk

awk [选项] ‘匹配{} 匹配{} 匹配{}’ filename:分割
-F:
-v:

sort

sort(选项)(参数):排序

知识

信息操作

Linux 有三个标准 IO:stdin(标准输出)、stdout(标准输入)、stderr(标准错误),对应的文件描述符是 0、1、2
Shell 入门 - 图1
Shell 入门 - 图2
Linux 下,当一个用户进程被创建的时候,要从某个地方读入数据、将数据输出到某个地方,因此系统会自动为该进程创建三个数据流(stream)

2 > &1

将标准错误重定向到标准输入上,& 是为了区分文件描述符和文件名

1 > /dev/null

将标准输出重定向到/dev/null的设备文件,null表示一个空设备文件,用来丢弃信息

2 > &1 1 > /dev/null

将标准错误重定向到标准输入,同时标准输出又重定向到/dev/null,也就是输所有信息全部丢弃

变量操作

给变量赋值并引用

  1. a="0"
  2. b="$a"
  3. c="${b}"
  4. echo $a $b $c

还可以引用未定义、为赋值的变量

  1. echo $a
  2. b=
  3. echo $a $b