shell解析器
执行命令
[root@192 /]# sudo cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
可以看到shell有4种解析器,默认解析器 /bin/bash
shell入门
脚本以 #!/bin/bash
开头,指定解析器
执行 shell 脚本
-
bash xxx.sh 或者 sh xxx.sh ,调用bash 解析器执行,脚本本身不需要执行权限
-
./xxx.sh 脚本自己执行,注意有没有执行权限
shell中的变量
系统变量
常用系统变量
$HOME, $PWD, $SHELL, $USER,获取所有系统变量 set
自定义变量
1. 基本语法
-
定义变量: 变量=值,不能有空格
-
删除变量: unset 变量,不能删除只读变量
-
只读变量: readonly 变量,只能读取,不能修改、删除
2. 定义变量规则
-
变量名称可以由字母、数字、下划线组成,但是不能以数字开头,环境变量建议大写
-
等号两侧不能有空格
-
在 bash 中,变量默认类型都是 字符串类型,无法直接进行数值运算
-
变量的值如果有空格,需要使用 双引号 或 单引号 括起来
-
将 局部变量 升为 全局环境变量,可供其他shell程序使用:export 变量名
3.使用变量
$param 或 ${param}, 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
特殊变量
$n :n为数字,$0代表该脚本名称,$1- $9 代表第一至第九个参数,十以上的参数需要用大括号包含,如 ${10}
$# :获取所有输入参数的个数,常用于循环
$* :表示命令行中的所有参数, $* 把所有参数看成一个整体
$@ :表示命令行中的所有参数,不过 $@ 把每个参数区分对待
$? :最后一次执行命令的返回状态,正确执行为0,执行错误则为非0(具体是哪个数,由命令自己决定), 函数返回值在调用该函数后通过 $? 来获得
$* 与 $@ 区别:
-
相同点:都是引用所有参数
-
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数 )
字符串
-
获取字符串长度, ${#string}
-
获取子字符串, ${string:n1:n2}
数组
定义
array=(v1 v2 v3 ...),注意每个值中间用空格隔开
根据索引 修改/赋值
array[i]=v_i
使用数组变量
-
${array[i]},获取某个索引值
-
${array[@]},${array[*]} ,获取数组中的所有值
-
${#array[@]},${#array[*]} ,获取数组长度,与字符串相同
运算符
基本语法
有两种写法:
-
"$((运算式))" 或 "$[运算式]",运算式就是原始的易读运算式
-
expr + , - , \* , / , % ,加,减,乘(注意有个反斜杠 \) ,除,取余;expr 运算符之间要有空格
计算 (3+2)*4 : 先计算3+2,再做*4,用Esc下面的键 ` 隔开
expr `expr 3 + 2` \* 4
echo $[(3+2)*4]
1. 基本语法
[ condition ] 注意 condition 前后要有空格
条件非空即为true,[] 则为false
多条件判断:与 && , 或 ||
2. 常用判断条件
(1)字符串比较
-
=,相等;[ $a = $b ],等号两边有空格
-
!=,不等;[ $a != $b ],等号两边有空格
-
-z ,字符串长度是否为0,为0返回true, [ -z $a ]
-
-n,字符串长度是否不为0,不为0返回true,[ -n $a ]
-
$, 字符串是否为空,不为空返回 true ,[ $a ]
(2)两个整数之间比较
-
-eq 等于 (equal)
-
-ne 不等于 (not equal)
-
-lt 小于 (less than)
-
-le 小于等于 (less equal)
-
-gt 大于 (greater than)
-
-ge 大于等于 (greater equal)
(3)按照问价权限进行判断
-
-r 读权限, [ -r $file ]
-
-w 写权限, [ -w $file ]
-
-x 执行权限, [ -x $file ]
(4)按照文件类型进行判断
-
-f 文件存在且为常规文件,[ -f $file ]
-
-d 文件存在且为目录,[ -d $file ]
-
-e 文件存在 (existence), [ -e $file ]