[Linux]-Shell编程与规范
1.脚本文件
Shell脚本一般以.sh为后缀名.但注意在Linux中.sh不是作为文件类型识别的依据,仅仅只是用来向看到的人标记这是一个Shell脚本而已.
Shell脚本一般有一个头声明 #!/bin/bash 告诉Linux应该用什么来执行脚本,如果没有,Linux默认将使用bash来执行脚本
2.脚本的执行方式
source [文件名]
. [文件名]
./ [文件名] (注意这种方式文件需要有执行权限)
bash/dash/sh [文件名]
3.管道符
管道符 | :将上一个命令的执行结果作为下一个命令的参数传入.这是一个非常有用的使用
一个使用率非常的高的语句 ps *** | grep 'xxxx' 就是一个管道符的最好例子. 这句话的本意是 执行ps **** ,并在返回结果再执行过滤 'xxxx'
4.重定向
Linux标准是由输入设备(键盘)获取输入,将结果输出到输出设备(屏幕).重定向就是这个输入输出的转向
4.1 标准重定向
输入重定向
< 输入重定向
例 wc < file 对file文件的内容进行单词计数.
输出重定向
>输出重定向(以覆盖方式) >>输出重定向(以追加方式)
例: ls > file 将ls的执行结果放入file文件中(ls的输出本来是屏幕,输出重定向到文件)
&> 混合输出
4.2 签入文档重定向
<<delimiter delimiter 将delimiter之间的内容作为输入传入给前面的命令
例:$wc -l << EOF
xxx
EOF
4.3 黑洞重定向
command > /dev/null
/dev/null是Linux定义的一个特殊的存在.所有向它写入的东西将全部消失,所有向它读取的东西将什么也读不到,所以称之为黑洞.
5.变量
5.1 自定义变量
5.1.1 变量的声明
shell中变量区分大小写,可以以字母或者下划线开头.规范是系统变量全大写,自定义变量纯小写,以下划线分割
注意:shell中定义变量temp=1,=前后不能有空格.
5.1.2 变量的作用范围(局部&全局)
export 声明: export是将声明的变量由局部变量升级为全局变量.默认情况下声明的变量只会在当前运行的shell环境有效,export后变量可以再进入新的shell环境后依然有效
5.2 预定义变量
由bash预先定义的一些特殊变量,可以直接使用但不能修改
$$ 当前脚本执行的进程ID
$0 当前脚本的文件名
$n(1-9) 执行脚本传入的第n个参数
$# 执行脚本传入的参数的格式
$* 执行脚本传入的所有参数 当被双引号包裹时,$*将所有参数作为一个整体输出 " a b c d"
$@ 执行脚本传入的所有参数 当被双引号包裹时,$@将所有参数分开作为个体输出 "a" "b" "c" "d"
$? 上个命令的退出状态或者函数执行的返回值
5.3 变量的数学运算
变量的数学计算不能直接使用. A+B在shell中的含义是A和B两个作为字符串拼接.
数学计算需要使用 expr 关键字
expr [变量] [运算符] [变量2] <=注意,运算符的前后必须有空格
例子: c=`expr $x + $y`
6.流程控制
6.1 if 语句
6.1.1 语法
if [[ 条件 ]];then ... elif [[ 多个条件 ]];then ... else ... fi
6.1.2 条件符
数值比较
-eq 测试两个整数是否相等
-ne 测试两个整数是否不等
-gt 测试一个数是否大于另一个数
-lt 测试一个数是否小于另一个数
-ge 大于或等于
-le 小于或等于
字符串比较
[ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
[ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
[ STRING1 = STRING2 ] 如果两个字符串相同则为真 ;
[ STRING1 != STRING2 ] 如果字符串不相同则为真 ;
[ STRING1 ] 如果字符串不为空则为真,与-n类似
文件&文件夹&目录比较
COUNTER=0 while [ $COUNTER -lt 5 ] do COUNTER='expr $COUNTER+1' echo $COUNTER done
while read text do echo ${text} done < /home/infile
模式1)
....
;;
模式2)
....
;;
*)
.....
;;
esac
case行尾必须为单词“in”,每一个模式必须以右括号“)”结束。
双分号“;;”表示命令序列结束。
匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。
最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后的命令序列。