入门shell编程
第一个shell脚本
1 |
|
让我们看一下以上代码都做了什么:
- 从系统path中寻找指定脚本的解释程序
- 创建 名叫code文件夹
- 进入创建的文件夹
- for循环3次
- 创建文件
- 往创建的文件中写入信息
- 结束循环
mkdir, touch,cd,touch,echo都是系统命令,在命令行下可以直接执行 for, do, done 是shell脚本语言 for循环的语法.
编写shell
新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php,扩展名为php,如果你用Python,扩展名为python.
第一行一般是这样:
1 | #!/usr/bin/php |
运行shell脚本有两种方式
作为可执行程序
1
2chmod +x op_base.sh //设置op_base.sh可执行权限
./op_base.sh //执行op_base.sh文件作为参数
1
/bin/sh op_base.sh
变量
定义变量时,变量名前不需要加符号和Python一样,但是在PHP语言中变量需要加$.如my_name="jack"
变量名和=之间不能有空格且变量后不能有;
号.
使用变量
对于已经定义过的变量,使用的时候在前面添加$
,如echo $my_name
,或echo ${my_name}
.花括号是可选的,但建议加上.因为花括号是为了帮助解释器识别变量的边界.
注释
单行注释使用#
,解释器会忽略该行
sh 里没有多行注释,只能每一行加一个#号.
字符串
shell 不像其他语言如 php,python 有很多数据类型,在 shell 中常用的数据类型即字符串和数字.
shell中的引号和 php 类似,可以用单引号或双引号,双引号中可以有变量,可以出现转义字符,但单引号中的变量是无效的.python 中引号没有区别,且存在三个引号.三个引号不会被转义.
字符串操作
拼接字符串
1
2
3a="hello"
b="world"
echo $a $b
获取字符串长度
1
echo ${#a}
截取字符串
1
echo ${a:0:2}
shell 数组
定义数组
在 shell 中用括号表示数组,数组元素用空格分隔开.如name=(name1 name2 name3)
还可以单独定义数组的各个分量如arr[0]=name1
读取数组
读取数组的一般格式是${数组[下标]}
,比如echo ${name[0]}
,使用@
符号可以获取数组中所有元素.例如echo $name[@]
获取数组长度
获取数组长度与字符串类似,例如:
1 | #获取数组元素个数 |
shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……1
2
3./test.sh 1 2 3
$0 # ./test.sh
$1 # 1 ...
shell 运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
1 | # 算术运算符 |
test 命令 和 [[]]
test命令用来测试某条件是否成立,可以用[]代替, 但[]内部不能使用||和&&以及!,[[]]支持这种写法,1
2
3
4
5
6
7read tel
if [[ $tel =~ ^1[0-9]{10}$ ]]
then
echo "你输入的是手机号码"
else
echo "你输入的不是手机号码"
fi
echo 和 printf
echo 和 printf是用于字符串的输出.1
2echo "$1" > xx.txt
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
shell 流程控制
和其他编程语言流程控制不同,sh的流程控制不能为空
如 js 流程控制
1 | var a = true |
在 sh/bash 里不能这么写,如果 else 分支没有执行语句就不要写 else. 如:
1 |
|
for 循环
shell 的 for 循环和 python 类似.
python 的 for 循环:
1 | for item in 1,2,3,4,5: |
shell 的 for 循环写法一:
1 | for item in 1 2 3 4 5; |
shell 的 for 循环写法二:
1 | for ((i=0;i<5;i++)); |
while语句
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据,命令通常为测试条件.
1 | int=1 |
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数
shell 函数
1 | funWithReturn(){ |
输出/输入重定向
1 | # > 输出重定向到 file |
shell 结合系统命令
shell脚本结合系统命令会更加强大,在字符串处理领域,有 grep,awk,sed 三剑客, grep 负责找出特定的行, awk 能将行拆分成多个字段, sed 则可以实现更新插入删除等写操作.例如定时检测 nginx,mysql 是否被关闭.
1 | path=/var/log |