入职这段时间大量使用shell,有一些零散的点,记在这里备忘。
一 shell种的if
shell中的if与c中的if用法有很大区别,一般是结合[ ]使用(目前我只这么用过:>),例如if [ $a -eq 0 ]; then do ... done。中括号实际上起真正的判断作用,需要特别注意的是,[和]两边都需要有空格。
[]中,与数字比较时,有以下几种关系操作符:
-eq 相等
-ne 不相等
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
与字符串比较时,有以下操作符:
= 等于
!= 不等于
注意:关系操作符两边都要加空格。
二 shell中的循环
for循环有以下几种使用方法:
1
for file in $(ls); do
echo $file
done
$(ls)是把ls当做命令执行,输出结果当做数组的值,数组的每个元素是按空白符分开的。
2 类似c语言的用法
for ((i=0; i<10; i++)); do
echo $i
done
(())中的变量可以不加$,在这里与c语言一样。
3
for i in 0 1 2 3; do
echo $i
done
4
for i in {1..3}; do
echo $i
done
while循环的用法:
while 条件表达式; do
循环体
done
条件表达式可以有许多形式,如for循环种(())的类似c语言的方法,还可以是if中类似的条件语句。
三 awk
在日志分析时,awk和sed是最常用的命令,这里简单介绍一下。
1 基本方法:awk -F”分隔符” ‘BEGIN{}condition_1{}condition_2{}END{}’ input_file_1 input_file_2
2 BEGIN{}和END{}是可选的,其实BEGIN和END也相当于特殊的condition。BEGIN{}是awk启动时先执行的操作,其中的语句会在输入文件被处理之前执行,里面一般是一些初始化操作。END{}是所有输入文件处理完之后执行的部分,在统计类的应用中常用。
3 condition是在处理输入的每行之前检查的条件,如果符合条件,才执行后面花括号中的语句。condition可以是==、>、<之类的条件语句,也可以使用正则表达式,如var~/abc/表示变量var匹配//中的正则表达式。
4 awk中有一些内置的变量,如$n表示正在处理的一行中的第n个字段(字段是以-F后面的分隔符分的),字段从1开始算起。$0表示整行。ARGIND表示第几个输入文件(mac系统下貌似有问题),NF表示当前行的字段个数,NR表示当前处理的行数。
5 condition之间(包括BEGIN和END)没有先后顺序,可以把END{}写在BEGIN{}前面。
6 最后面是输入文件,可以有多个,awk会按文件名的顺序处理输入文件。
四 函数
最后说一下shell的函数,函数的声明方式为:
function foo()
{
x=$1
...
}
调用方法:foo argv
函数可以接受参数,在函数中通过$1,$2来使用参数
注意:shell中,函数中的变量是全局变量!