概念
shell脚本语言就是一门简单的高级语言,它的文件名是以.sh结尾的
环境
Linux或者Ubuntu都默认安装了shell解释器
脚本解释器
- sh:即Bourne shell,POSIX(Portable Operating System Interface)标准的shell解释器,它的二进制文件路径通常是/bin/sh,由Bell Labs开发。本文讲的是sh,如果你使用其它语言用作shell编程,请自行参考相应语言的文档
- bash:Bash是Bourne shell的替代品,属于GNU Project,二进制文件路径通常是/bin/bash。业界通常混用bash sh 和shell
第一个shell脚本
编写
打开文本编辑器,新建一个文件,扩展名为sh,输入一些代码,第一行一般是这样:
#!/bin/bash
#!/usr/bin/php
‘#!’是一个约定的标记,它告诉系统这个脚本需要用什么解释器来执行
运行
运行shell脚本有两种方法:
- 作为可执行程序
chmod +x test.sh
./test.sh
注意,一定要写成./test.sh,而不是test.sh,运行其他二进制程序也是一样,直接写test.sh,linux系统回去PATH里寻找有木有叫test.sh的,而只有/bin, /sbin 等在path里,你当前路径通常不在path里,所以写成test.sh是会找不到的,要用./test.sh告诉系统就在当前目录下找。
2.作为解释器参数
这种方式是直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh
/bin/php test.php
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
变量
定义变量
定义变量时,变量名不加$符号,变量名和等号之间不能有空格。
My_name='xiaoyi'
使用变量
使用一个定义好的变量,只要在变量名前面加$符号就行了
My_name="xiaoyi"
echo $My_name
变量名外的花括号可加可不加,加花括号是为了帮助解释器识别变量的边界,为了规范,一般希望大家加
My_name='xiaoyi'
echo ${My_name}
重定义变量
对于已经定义过的变量,可以被重新定义,如:
My_name='xiaoyi'
echo ${My_name}
My_name='meizhen'
echo ${My_name}
注释
sh中用#进行注释,sh中没有多行注释,只能每行加一个#号
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
字符串
- 单引号:
str='hello,xiaoyi'
注意:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效,单引号字符串中不能出现单引号。
- 双引号:
My_name='xiaoyi'
str="hello ${My_name}"
注意,双引号中可以有变量,双引号里可以有转义字符
字符串操作
获取字符串长度
My_name="xiaoyi"
echo ${#My_name} #输出6
查找子字符串
string="xiaoyi is cool"
echo `expr index "$string" is` #这个话的意思是找出is在这个string中的位置
条件判断
if
if condition
then
conmand1
conmand2
conmand3
...
conmandN
fi
写成一行(适用于终端命令提示符):
if `ps -ef | grep ssh`; then echo hello;fi
注意:末尾的fi就是if倒过来写的,以后还会遇到类似的
is else
if condition
then
command1
command2
...
commandN
else
command
fi
循环语句
for
for var in item1 item2 ... itemN
do
command1
command2
command3
...
commandN
done
写成一行:
for var in item1 item2 ... itemN;do command;command2... done;
while
while condition
do
command
done
until
until condition
do
command
done
选择语句
case
case "${opt}" in
"A")
command1
;;
"B")
command2
;;
* ) echo "Bad option, please choose again"
esas
case语法和C语言差别很大,它需要一个esac作为结束标记,每个case分钟用右圆括号,用两个分号表示break.
参考资料
https://github.com/qinjx/30min_guides/blob/master/shell.md
Advanced Bash-Scripting Guide,非常详细,非常易读,大量example,既可以当入门教材,也可以当做工具书查阅
Unix Shell Programming
Linux Shell Scripting Tutorial - A Beginner’s handbook