[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默认shellBourne again shell(bash) ,Linux系统默认shellcsh: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/bashecho "当前脚本名称为$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-thenif [ condition ]thencommandselsecommandsfi// 方括号左右两边必须有空格: 循环语句// forfor var in listdocommandsdone// whilewhile conditiondocommandsdone: 分支命令, case命令case var inmode1) command1;command2;;mode2) command1;command2;;esac
