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

             

 

只有 一个判断条件为单分支

  当判断条件多余一个时,则为多分支

 

posted @ 2017-03-23 13:59  九级大狂风  阅读(268)  评论(0编辑  收藏  举报