[Shell 脚本编程]
: 脚本是一个包含一系列命令序列的文本文件, 当运行这个脚本文件时,文件中包含的命令序列将得到执行
// 脚本主要由两部分组成: 脚本解释器和命令序列
// #!/bin/bash 指明脚本解释器为Bash Shell
[]
# 查看系统, 安装的SHELL脚本解释器
: cat /etc/shells
: echo $SHELL
# SHELL 环境
: 系统环境, 永久环境变量, 变量写入配置文件
=> /etc/profile 针对所有用户生效
=> $HOME_name/.bash_profile 针对特定用户有效
: 系统预定义的环境变量
// PATH、 HOME、SHELL、PWD等
: 临时环境, 临时环境变量
// 用户在当前登陆环境生效的变量
// 用户登陆系统后, 直接在命令行上定义的环境变量便只能在当前的登陆环境中使用
[分类]
: 常见的shell分为两大主流
sh:
Bourne shell(sh) ,Solaris,hpux默认shell
Bourne again shell(bash) ,Linux系统默认shell
csh:
C shell(csh)
tc shell(tcsh)
[SHELL 脚本格式]
: 首行, 表示脚本将要调用的shell解释器
// #!/bin/bash
// #!符号能够被内核识别成是一个脚本的开始, /bin/bash 脚本解释器绝对路径
: 执行, 输入脚本的绝对路径或相对路径
// /root/helloWorld.sh | ./helloWorld.sh
: bash或sh + 脚本 执行
: 脚本的路径前再加". " 或 source 执行
// 第一种和第二种会新开一个bash, 不同bash中的变量无法共享。第三种, 在同一个shell里面执行的
基本语法
命令参数
[]
: Shell脚本也可以使用命令行参数
// $# 传入脚本的命令行参数个数
// $* 所有命令行参数值, 在各个参数值之间留有空格
// $0 第0个命令行参数, 命令行本身(Shell文件名)
// $1 第1个命令行参数
vim ec.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别为$*"
echo "第一个参数为$1,第五个为$5"
变量
[变量]
: 分类, 用户自定义变量,环境变量,位置参数变量和预定义变量
: Shell脚本允许用户设置和使用自己的变量
// 变量可以使数字或者字符串,用户无需指定其类型,也无需在使用前定义。
// 定义时无需加"$", 赋值“=”左右不能有空格, 注释用“#”
: set 查看设置变量
: unset 撤销变量
# 位置参数变量
// $n , n为数字, 0代表命令本身, 1-$9代表第一到第9个参数,十以上的参数需要用大括号包含,如${10}。
// $* , 代表命令行中所有的参数,把所有的参数看成一个整体。以"12 … $n"的形式输出所有参数
// $@ , 代表命令行中的所有参数,把每个参数区分对待。以"1""2" … "$n" 的形式输出所有参数
// $# , 代表命令行中所有参数的个数。添加到shell的参数个数
# 预定义变量
// $? , 执行上一个命令的返回值 执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
// $$ , 当前进程的进程号(PID),即当前脚本执行时生成的进程号
// $! , 后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程 &
: 数学表达式, 命令expr
// 例如expr 5+1,当要把计算的结果赋值给其他变量时,还需要用反引号:·`expr 5+1`
: 条件比较 (操作符两边必须有空格)
=> 比较
//
=> 条件
// -r file:文件对当前用户可以读取
// -w file:文件对当前用户可以写入
// -x file:文件对当前用户可以执行
// -f file:文件是普通文件
// -d file:文件是一个目录
// -c file:文件是字符设备文件
// -b file:文件是块设备文件
// -s file:文件大小不为0
// -t file:文件的描述符指定的设备为终端
// -e file:文件已经存在
// -a:与
// -o:或
// !:非
: 流程控制语句
// if-then
if [ condition ]
then
commands
else
commands
fi
// 方括号左右两边必须有空格
: 循环语句
// for
for var in list
do
commands
done
// while
while condition
do
commands
done
: 分支命令, case命令
case var in
mode1) command1;command2;;
mode2) command1;command2;;
esac