overall
shell 脚本也是动态解释型语言,shell脚本第一行指定了脚本解释器
#! /bin/sh
#! /bin/bash
...
脚本执行方式
- ./xxx.sh 向二进制可执行程序一样
- /bin/sh xxx.sh 作为脚本解释器的参数执行
变量
赋值
- 显示赋值 : var=123 注意
=
左右不能有空格 - 语句赋值: for file in
ls /lib
使用变量
- 变量名前加
$
符号,例如$var
or${var}
删除变量
- unset var
类型
- 局部变量 , 脚本内部定义的变量,在当前文件中有效
- 环境变量,所有程序都可以访问
- shell变量,shell程序设置的特殊变量
$#
参数总个数$*
以一个单字符串显示所有参数$$
脚本当前进程号$@
$?
显示最后命令的退出状态,0表示没有错误$*
与$@
区别:有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
字符串
‘’ 原样输出
“” 可以转义和输出变量
${#str}
获取str字符串长度,不含\0
${str:1:4}
提取子字符串,从index 1开始的4个字符
数组
arr=(v1 v2 v3 ...)
- 读取数组:
${arr[index]}
${arr[@]}
数组所有元素${#arr[@]}
数组元素的个数
运算符
算法运算符
- shell 不支持数学运算,但是可以通过 awk ,expr 命令来实现
$ a=10
$ b=2
$ echo `expr $a + $b`
12
$ echo `expr $a - $b`
8
$ echo `expr $a \* $b`
20
$ echo `expr $a / $b`
5
$ echo `expr $a % $b`
0
$ echo `expr $a == $b`
0
$ echo `expr $a != $b`
1
- [ $a == $b ] 返回 false。
- [ $a != $b ] 返回 true。
- 条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
- 乘号
*
前边必须加反斜杠\
才能实现乘法运算
关系运算符
- 支持数字,不支持字符串,除非字符串的值是数字
假定变量 a 为 10,变量 b 为 20
op | introduction | example |
---|---|---|
-eq | 是否相等 | [ $a -eq $b ] 返回 false |
-nq | 是否不相等 | [ $a -ne $b ] 返回 true |
-gt | 是否大于 | [ $a -gt $b ] 返回 false |
-lt | 是否小于 | [ $a -lt $b ] 返回 true |
-ge | 是否大于等于 | [ $a -ge $b ] 返回 false |
-le | 是否小于等于 | [ $a -le $b ] 返回 true |
布尔/逻辑运算符
-o
||-a
&&!
!
文件测试运算符
op | introduction |
---|---|
-b file | 是否是块设备文件 |
-c file | 是否是字符设备文件 |
-d file | 是否是目录 |
-f file | 是否是普通文件 |
-r file | 是否可读 |
-w file | 是否可写 |
-x file | 是否可执行 |
-s file | 文件大小是否大于0 |
-e file | 是否存在 |
流程控制
if else
if condition
then
cmd
fi
if condition1
then
cmd1
elif condition2
then
cmd2
else
cmd3
fi
- 写在一行中的时候,加
;
号
if [ $a != $b ]; then echo "dddd"; fi
for
for var in item1 item2 ... itemn
do
cmd
done
#!/bin/bash
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
- 写在一行中的时候,加
;
号
for var in item1 item2 ... itemN; do command1; command2… done;
while
while condition
do
cmd
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
while true
do
cmd
done
函数
[ function ] funname [()]
{
cmd;
[return int;]
}
- 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
- 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
函数参数
- 使用
$n
来获取,和shell 参数一样
文件包含
- 和 c语言的include一样
- 在f1文件中可以定义函数、变量,在f2文件中使用
. filename # 注意点号(.)和文件名中间有一空格
source filename