shell判断表达式
------
source 导入其它sh文件
$# -- 参数的总数
$@ -- 所有参数值,等分划分相互独立
$* -- 所有参数值,作为一个整体
命令 test
test [选项] [name]
| 选项 | 说明 | 示例 |
| :--------------: | :------------------------------------: | :------------------------: |
| -e | 判断文件是否存在 | |
| -f | 判断文件是否存在且为文件 | |
| -d | 判断是否存在且为目录 | |
| -r , -w , -x | 分别判断文件是否存在且有rwx权限 | |
| -u , -g | 分别判断文件是否存在且有uid和gid属性 | |
| -k | 判断文件是否存在且是二进制文件 | |
| -s | 判断文件是否存在且是非空文件(文件内容) | |
| -nt | 判断[file01]是否比[file02]新 | test [file01] -nt [file02] |
| -ot | 判断[file01]是否比[file02]旧 | test [file01] -nt [file02] |
| -ef | 判断是否同一文件(inode是否同一) | |
| -z | 判断参数内容或字符串长度是否为0 | test -z [name] / "hello" |
| [str01]==[str02] | 判断是否相等 | test [str01]==[str02] |
| -a | 多条件并立使用,-a --> and | test [-r ···] -a [-w ···] |
| -o | 多条件选择使用,-o --> or | test [-r ···] -o [-w ···] |
注:-eq、-ne、-gt、-lt、-ge、-le分别为判断相等、不等、大于、小于、大于等于、小于等于,可用(( [num01 ] [运算符] [num02] ))取代;例:(( 20 >= 10 ))。
------
判断符号 [ ]
格式:[ "${name}" == "hello" ] (含空格)
[[ [name] =~ [0-9]+ ]] -- 当中 =~ 为开启匹配正则表达式
set
-u -- 发现任何未定义变量结束运行,并抛出异常
-e -- 发现任何命令的$?为非0,结束运行并抛出异常
-o pipefail -- 管道中的所有命令都成功,命令的返回值才是0
read
-a -- 输入的值为数组,空格为分隔符
-d [val] -- 设置结束标识符,输入[val]结束
-p [val] -- 提示信息
-e -- 在输入的时候可以使用命令补全功能
-n [val] -- 定义输入文本的长度
-r -- 屏蔽\转义字符
-s -- 安静模式
-t -- 输入时等待时间while read line -- 读取文件
do
echo $line
done < [file]
```
判断语句和循环语句
------
if
if [ 判断条件 ];then
···
elfi [ 判断条件 ];then
···
else
···
fi
case ... esac
注:相当于java中 switch ... case
case [判断变量] in
[值1]|[值2]..)
···;;
[值1]|[值2]..)
···;;
[值1]|[值2]..)
···;;
esac
------
循环
while ... do ... done
while [判断条件]
do
···
done
读取文件:
```
while read [row]
do
echo $[row]
done < [filepath]
```
until...do...done
```
until [判断条件] # 为真则停止循环
do
···
done
```
for do done
for [var] in [number] [number01] ...
do
···
done
for ((var=1;var<=10;var++))
do
···
done
读取文件
```
[file]内容
hello word
good!
``````
for $(cat [file])
-- 默认以空格为读取分界点,只需要将环境变量IFS(export)修改为\n,
-- 既可将分界点改为换行读取
```
控制语句break和continue
break :结束整个循环的执行,默认情况下结束离它最近的一个循环。
continue :跳过循环,进入下一次循环。
for ((var i;i<=10;i++))
do
...
break/continue
done
------
数组
声明:`[array] = ( var1 var2 var3 ···)`
获取:`echo "${array[0]}"${array...}`
获取文件内容:`[array] = ( $(cat [file] ) )` //每行做一个值,由IFS(export)控制
#### declare 声明关联数组
关联数组 === > 集合 key-value
declare -A [array]=([key1]="value1" [key2]="value2") //声明一个关联数组
[array][key]=[value] //赋值或修改
${[array][*]} //获取所有value
${![array][*]} //获取所有key
${#[array][*]} //统计key-value数量
unset [array][key] //删除指定key-value
```
------
函数
[name]() {
···
}
function [name] () {
···
}
[name]() {
echo $1 $2 ··· # 大于9个参数后${num}
}
[name] [参数] ··· # 调用并传参