基本
脚本开头
指定解析器
#!/bin/bash
脚本注释
Bash 只支持单行注释,使用#
开头的都被当作注释语句
#整行注释
echo hello world #行尾注释
通过 Bash 的一些特性,可以取巧实现多行注释,但是不可取,个人建议老老实实用#
;嫌麻烦可以好好学学 vim,熟练以后操作起来快得很。
数据类型
Bash 中基本数据类型只有字符串,连数值类型都没有,declare -i
可强制声明数值类型。
#都是字符串
echo abcd
echo 1234
字符串联
Bash 中字符串的串联操作不需要任何操作符,直接将两段数据连接在一起。
echo 123 456
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
if [ 条件判断 ]:then
程序
fi
或
if [ 条件判断 ]
then
程序
fi
case
case $变量名 in
"值1")
程序
;;
"值2")
程序
;;
*)
程序
;;
esac
for
for((初始值;循环条件;变量变化))
do
程序
done
for 变量 in 值1 值2 值3 ...
do
程序
done
while
while [ 条件判断 ]
do
程序
done
输入
选项
参数
函数
系统函数
basename [string / pathname] [suffix]:删除最后一个/
的所有前缀,还可以指定删除suffix
后缀
dirname 文件绝对路径:去除文件名,返回剩下的路径
自定函数
function 函数名()
{
Action;
&?或者return int(0-255);
}
函数名
工具
cut
cut [选项] filename:剪切数据
-f:列号,提取第几列
-d:分隔符,按指定分隔符分割列,默认为制表符
sed
sed [选项] ‘命令’ filename:按行依次执行,结果打印到屏幕,不改变文件内容,除非重定向存储输出
-e
-i:直接修改文件
a:新增
d:删除
s:查找并替换
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
awk
awk [选项] ‘匹配{} 匹配{} 匹配{}’ filename:分割
-F:
-v:
sort
知识
信息操作
Linux 有三个标准 IO:stdin(标准输出)、stdout(标准输入)、stderr(标准错误),对应的文件描述符是 0、1、2
Linux 下,当一个用户进程被创建的时候,要从某个地方读入数据、将数据输出到某个地方,因此系统会自动为该进程创建三个数据流(stream)
2 > &1
将标准错误重定向到标准输入上,& 是为了区分文件描述符和文件名
1 > /dev/null
将标准输出重定向到/dev/null
的设备文件,null
表示一个空设备文件,用来丢弃信息
2 > &1 1 > /dev/null
将标准错误重定向到标准输入,同时标准输出又重定向到/dev/null
,也就是输所有信息全部丢弃
变量操作
给变量赋值并引用
a="0"
b="$a"
c="${b}"
echo $a $b $c
还可以引用未定义、为赋值的变量
echo $a
b=
echo $a $b