写在前面
做Linux系统开发相关工作免不了与shell打交道,另外用好shell并不是熟知shell语法就可以了,还需要对相关的Linux命令非常熟,才能写出功能强大的shell脚本,本篇文章并不会详细地讲解shell的语法知识,但是会推荐一些有价值的资料,本文的主要目的是,记录shell关键的知识点、需要注意的坑点、一些常见场景下的shell脚本。
对shell的学习可以参考的资料如下(下面笔记大部分来自参考资料):
Bash shell
shell严格意义上讲是用户与内核交互的工具,由系统调用实现,shell script是指用shell写的脚本程序,但是往往我们简单的说,把shell与shell script等同了,shell有很多种,Bourne Shell(/usr/bin/sh
或/bin/sh
)、Bourne Again Shell(/bin/bash
)等等,但是最常用的是bin/bash
。
1)变量
- 使用变量:
${variable_name}
- 只读变量:
readonly varable_name
- 删除变量:
unset variable_name
,unset不能删除只读变量
2)字符串
单引号与双引号的区别与PHP中相同,单引号不会对字符串内做解析和转义,而双引号会对字符串中的变量进行解析或者转义字符进行转义
- 拼接字符串:
${variable_name1}${variable_name2}
- 获取字符串长度:
${#varable_name}
- 提取子字符串:
expr index $string char_name
3)数组
- 定义:
arr_name=(val1 val2)
- 使用:
$arr_name[$index]
- 获取数组所有元素:
${arr_name[@]}
- 获取数组长度:
length=${#arr_name[@]}
or:
length=${#arr_name[*]}
- 获取数组某个元素长度:
length=${#arr_name[$index]}
4)传递参数
用户可以通过命令向脚本传递参数,函数调用也可以向函数体内传递参数,两者是相同的。
$n
表示脚本的第n个参数(n>=1),比如$1
是第1个参数,而$0
表示脚本的名字或者函数的名字,以下是几个特殊字符:
参数 | 说明 |
---|---|
$# | 传递到脚本参数个数 |
$* | 以单字符串显示脚本传递的参数 |
$$ | 脚本运行的当前进程ID |
$! | 后台运行的最后一个进程ID |
$@ | 与$*同 |
$? | 显示最后命令退出状态,0表示success |
5)流程控制
if:
if condition
then
...
fi
if-else:
if condition
then
...
else
...
fi
if else-if else:
if condition1
then
...
elif condition2
then
...
else
...
fi
for:
for var in val1 val2
do
done
while:
while condition
do
...
done
case: 类似C语言中的switch case
case 值 in
模式1)
...
;;
模式2)
...
;;
esac
6)函数
形式如下:
function func_name(...)
{
...
return $res
}
调用:
func_name $val1 $val2
7)条件测试
- 数值测试:
-eq
等于,-ne
不等于,-gt
大于,-ge
大于等于,-lt
小于,-le
小于等于 - 字符串测试:
=
等于,!=
不等于,-z $string
字符串长度为0,-n $string
字符串长度不为0 - 文件测试:
参数 | 说明 |
---|---|
-e $filename | 文件存在 |
-r $filename | 文件存在且可读 |
-w $filename | 文件存在且可写 |
-x $filename | 文件存在且可执行 |
-s $filename | 文件存在且非空 |
-d $filename | 文件存在且为目录 |
-f $filename | 文件存在且为普通文件,i.e., regular files |
-c $filename | 文件存在且为字符设备文件 |
-b $filename | 文件存在且为块设备文件 |
常见场景需求
1)当需要遍历命令参数数组时候,参数字符串有空格
这里参考了这篇博客
for ((i = 0; i < ${#ARGS[@]}; i++))
do
echo "${ARGS[$i]}"
done
——————————
写在后面
对bash shell的一些命令或者细节用法记得不清楚没关系,用的时候查即可,写多了就熟练了,但是对基础的流程必须熟练。