shell基本语法

常用指令

cat
打印到标准输出设备上

grep
查找文件里符合条件的字符串或正则表达式

awk
awk 是一个文本处理工具

curl
请求web服务工具

sed
文本处理工具
wc
行统计工具

shell中可以 使用linux下各种工具不一一举例

运算语句

赋值

赋值和其他语言一样,使用“=”

1
2
3
4
5
6
7
8
9
10
# 数字
a=1

# 字符串
name='aaa'

name=“aaa”
#路径
PACK_TOOL_DIR=/linux/Linux_Pack_Firmware

运算符号

运算符号不能单独使用,需要配合运算命令

1
2
3
4
+ 加 -减 *乘 /除 
% → 取余
** → 开方

数学计算

shell 数学计算的几种命令,搭配上文运算符使用
整数运算

1
2
3
4
5
6
7
8
9

# expr
expr 1 + 1

# let
let a=100/3;echo $a

# $(())
echo $(( 100*3 ))

浮点数运算

1
2
3
4
5
# bc 
scale 为保留几位小数,可以不设置,默认是0

echo "scale=2;100/3"|bc
=> 33.33
逻辑运算
1
2
3
逻辑与运算 		&&
逻辑或运算 ||
逻辑非运算 !

条件语句

常使用在if语句中

条件比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 数字比较
-eq 等于 equal
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于

# 字符串比较
== 等于
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0
=~ 包含字符串

使用案例:
strA 是否包含strB字符串

1
2
3
4
5
6
7
8

if [[ $strA =~ $strB ]]
then
echo "包含"
else
echo "不包含"
fi

KEY_A 大于0 小于50 满足条件

1
2
3
4
5
6
7
8
9
10
if [ $KEY_A -gt 0 ] && [ $KEY_A -lt 50 ];then
echo "检测到按键 变化 $KEY_A"
if [ $key_value -eq 0 ];then
echo "输出电平1 改变 $KEY_A"
else
echo "输出电平0 改变 $KEY_A"
fi
else
flag=2
fi

注意:“[]” 内部两边需要有“ ”空格,其他条件需要另外的”[]”并用逻辑符号

文件判断
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d DIR ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。

循环语句

for 循环
1
2
3
4
5
6
7
8
9
10
11
12
# 普通定值循环
for ((i=1; i<=j; i++))
do
....
done
# 遍历列表

for i in {1..9}
do
....
done

while 循环

条件成立,执行

1
2
3
4
while  [ 条件或者函数返回值 ]
do
....
done
until 循环

条件不成立,则执行

1
2
3
4
until  [ 条件 ]
do
....
done

参数传递

shell脚本在执行时可传递参数,以下是脚本内对参数的处理符号

1
2
3
4
5
6
7
$#      传递脚本参数个数
$* 所有参数组成一个字符串, *也可指第几个参数,$0
$$ 当前进程号
$! 后台运行的最后一个进程的ID号
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

使用参考:

1
2
3
4
5
6
7
8
9
10
11
获取所有的参数放入OPTIONS,没有默认带-allsave
OPTIONS="${@:-allsave}"

结合 For 循环,遍历参数选项
for option in ${OPTIONS}; do
case $option in
xxx) fun_xxx ;; 执行函数xxx
xxx) fun_xxx ;;
*) usage ;; 其他参数
esac
done

函数

shell含有内置函数和自定义函数
自定义函数

1
2
3
4
5
6
7
# 标准写法
function show(){
....
}

# 函数调用
show

函数也可以传参

内置函数
内置函数 也是shell内置命令,可以使用 help查看

  • getopts

获取当前符合条件的参数列表

getopts OPTSTRING VARNAME

OPTSTRING:字符串,包含所有选项和“:”(“:”表示选项后面需要加参数)
VARNAME:变量,用来保存getopts获取到的选项
OPTARG: 参数会放入OPTARG中
OPTIND: 参数操作数,类似数组下标

使用参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while getopts ":a:bc" opt
do
case $opt in
a)
echo "this is -a option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]"
;;
b)
echo "this is -b option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]"
;;
c)
echo "this is -c option. OPTARG=[$OPTARG] OPTIND=[$OPTIND]"
;;
?)
echo "there is unrecognized parameter."
exit 1
;;
esac
done