1、Hello Shell
需要以#!/bin/bash开头
#!/bin/bash
echo "Hello Shell"
需要有执行的权限
sh hello.sh
或者
./hello.sh
2、变量定义
2.1、赋值=前后不可有空格
#!/bin/bash
first_name="wxx"
last_name="lyy"
echo $first_name
echo $last_name
2.2、只读变量,和java里的final一样
#!/bin/bash
last_name="wxx"
readonly last_name
last_name="lyy"
2.3、字符串
#!/bin/bash
first_name="张"
last_name="三"
str="大家好,我叫${first_name}${last_name}"
echo $str
#字符串长度
echo ${#str}
#截取字符串,大家好
str1=${str:0:3}
2.4、数组
#shell中,只有一维数组,且长度不限,可以连续赋值,也可以不连续赋值
#!/bin/bash
array=(1 2 3 4 5)
array[7]=8
array[8]=9
#读取数组${array[index]},index替换成@可以获取数组中所有元素
echo ${array[4]}
#数组长度${#array[@]}或者${#array[*]}
echo ${#array[@]}
3、传递参数
#!/bin/bash
echo "shell file name:$0"
echo "first variable:$1"
echo "secondary variable:$2"
echo "all variable list:$*"
echo "variable num:$#"
#执行shell文件
sh test.sh hi ha
#输出
shell file name:test.sh
first variable:hi
secondary variable:ha
all variable list:hi ha
variable num:2
4、运算符
4.1、算术运算符
#!/bin/bash
val=`expr 2 + 3`
echo "2 + 3 = ${val}"
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b
4.2、关系运算符
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
4.3、布尔运算符
运算符 说明 举例
这里a = 10 b = 20
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
4.4、逻辑运算符
运算符 说明 举例
这里a = 10 b = 20
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
4.4、字符串运算符
运算符 说明 举例
这里a = abc b = efg
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
4.5、文件运算符
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
5、流程控制
5.1、if判断
语法:
if condition
then
xxxx
elif condition
then
xxxx
else
xxxx
fi
#!/bin/bash
#输入一个参数,判断奇偶性
if [ $# -eq 0 -o $1 -eq 0 ]
then
echo "请输入一个合理的参数"
else
val=`expr $1 % 2`
case $val in
1) echo "${1}是奇数"
;;
0) echo "${1}是偶数"
;;
esac
fi
5.2、for循环
语法
for item in item1 item2 ... itemN
do
xxxxxx
done
案例
i=1
for ((i=2; i<=100; i+=10))
do
echo $i
done
输出2 12 22 ... 92
for i in `seq 100 110`
do
echo $i
done
输出 100 101 ... 110
死循环
for (( ; ; ))
5.3、while循环
语法
while condition
do
xxxx
done
案例
i=1
while (( $i<=100 ))
do
echo $i
i=$( expr $i + 10 )
done
输出 1 11 21 ... 91
死循环
while true
do
xxxx
done
5.4、case when
语法
case val in
val1) xxxx
;;
val2|val3|val4) xxxx
;;
*) xxxx
;;
esac
5.6、其他命令
break 跳出所有循环
continue 跳出本次循环
exit; 结束当前shell脚本
6、function
语法
[function] functionName[()]{
xxx
return xxx
}
[function]可以省略,直接函数名
案例
funcAdd(){
val=`expr $1+$2`
return val
}
#调用函数
funcAdd 1 1
#输出返回参数
echo $?
7、CUT
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除
例如从ifconfig中截取到ip地址
可以看到ip地址在第二行,所以利用grep查到当前行,再用cut分割截取
8、AWK
8.1、基本使用
语法
awk [选项参数] -f scriptfile var=value file(s)
------------------------------------------------
案例
log.txt内容如下
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
------------------------------------------------
8.2、分割
执行,以tab或空格分割 输出第一列和第四列
$ awk '{print $1,$4}' log.txt
2 a
3 like
This's
10 orange,apple,mongo
------------------------------------------------
格式输出
$ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
------------------------------------------------
使用-F指定分隔符,以,为分隔符
$ awk -F, '{print $1,$2}' log.txt
------------------------------------------------
或者使用内建变量
$ awk 'BEGIN{FS=","} {print $1,$2}' log.txt
------------------------------------------------
使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
$ awk -F '[ ,]' '{print $1,$2,$5}' log.txt