linux基础: shell----awk、 和shell script 的变量、运算符、if多分支 ----基本语法
一 什么是shell script :
将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
再加上些智能(条件/流控)控制,就变成了智能化脚本了.
二 变量:
1 为何要有变量
程序的运行就是一些列状态的变值值的变化去表示
2 变量命名规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.
最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件最好加上拓展名
5.见名之意,
例如: sql_money.tar.gz,log_age.tar.bz2
3 系统变量
set 和 env区别
set:显示所有变量
env:环境变量
4 变量赋值
如:money = 10
age = 20
echo $money
删除变量 unset age
5 数据类型
bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了
三 运算符
算术运算符:
1 加 +
2 减 -
3 乘 *
4 除 /
逻辑运算符:
1 大于 >
2 小于 <
3 等于 ==
4 不等于 !=
5 大于等于 >=
6 小于等于 <=
赋值运算符 :
1 =
2 +=
3 -=
4 *=
5 /=
6 %=
例如: a = 1
a = a + 1 简写为: a += a
其他的都是一样的意思
1 测试文件状态
-d 目录
-s 文件长度 > 0、非空
-f 正规文件
-w 可写
-r 可读
-x 可执行
-L 符号连接
-u 文件有 suid 位设置
2、字符串测试
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空串
3、测试数值
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
[root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大于号小于号等于号等,要使用man test中规定的
4、拓展测试符号 [[ ]] (())
4.1 数字测试符号
# [ 10 < 2 ] # 语法错误
-bash: 2: 没有那个文件或目录
#
# [[ 2 > 10 ]] # 结果错误
# echo $?
0
# [[ 20 > 10 ]] # 正确
# echo $?
0
# (( 10 < 20 ))
# echo $?
0
4.2 字符测试
# [ "aa" = "aa" ]
# echo $?
0
# [[ "aa" = "aa" ]]
# echo $?
0
# (( "aa" = "aa" )) #结果错误
# echo $?
1
4.3 混合测试
# [ a = a -a 10 < 20 ]
-bash: 20: 没有那个文件或目录
[root@seker ~]# [[ a = a -a 10 < 20 ]]
bash: syntax error in conditional expression
-bash: syntax error near `-a'
[root@seker ~]# [[ a = a && 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# [[ a = a || 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a || 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a && 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]#
结论:
1.1 比较数字,使用(( ))
其他测试使用 [[ ]]
包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))
1.2 两个文件的比较
FILE1 -ef FILE2
测试两个文件是否是相同的inode
有时为了找到同一个INODE号的文件 更倾向于使用 find 命令的 -inum 或 --samefile
FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2
FILE1 -ot FILE2
FILE1 is older than FILE2
四 流程控制
1分支结构
#!/bin/bash var='/etc/init.d' #var='/dev/sda' if [ -d $var ] then echo "$var is directory" elif [ -b $var ] then echo "$var is block" elif [ -f $var ] then echo "$var is regular file" else echo 'unknow' fi
if 测试中还可以执行命令 根据命令的返回值做判断
# if cd / ;then echo Y ;fi
# if grep -q root /etc/passwd ;then echo Y ;fi
向脚本传递参数
#test.sh echo $0 echo $1 echo $2 echo $3 echo ${11} echo '$$' $$ echo '$*' $* echo '$@' $@ echo '$#' $# echo '$?' $? ''' 测试:python test.sh 1 2 3 4 5 6 7 8 9 10 11 输出结果: ./test.sh 1 2 3 11 $$ 14312 $* 1 2 3 4 5 6 7 8 9 10 11 $@ 1 2 3 4 5 6 7 8 9 10 11 $# 11 $? 0 '''
修改脚本,使其能接收调用者传来的参数
[root@MiWiFi-R3-srv ~]# cat test_file.sh #!/bin/bash if [ -d $1 ] then echo "$1 is directory" elif [ -b $1 ] then echo "$1 is block" elif [ -f $1 ] then echo "$1 is regular file" else echo 'unknown' fi [root@MiWiFi-R3-srv ~]# ./test_file.sh /etc/passwd /etc/passwd is regular file
只有 一个判断条件为单分支
当判断条件多余一个时,则为多分支