zoukankan      html  css  js  c++  java
  • shell编程小结

    因为项目中要用到shell脚本,所以系统的看了一下。以前只是泛泛的了解。

     

    变量:环境变量、预定义变量、位置变量、自定义变量。

    环境变量这个好说,通过set或者env命令都能看到相应的列表,然后可以通过 echo ${VAR}显示出来。需要提一下,windows下也有环境变量,也可以使用echo %{VAR}%显示出来。

    如:

    [root@localhost]# env
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_TTY=/dev/pts/0
    USER=root
    MAIL=/var/spool/mail/root
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    PWD=/root
    JAVA_HOME=/opt/java
    LANG=en_US.UTF-8
    HISTCONTROL=ignoredups
    SHLVL=1
    HOME=/root
    LOGNAME=root
    
    [root@localhost]# echo $USER
    root
    
    [root@localhost]#

    预定义变量,顾名思义,就是定义好的一些变量,如”$”/”?”/”!”。

    作用分别是:代表当前pid、代表上一次执行的结果(returned num)、代表上一个后台进程pid!

    如:

    [root@localhost ~]# echo $$
    2118
    
    [root@localhost ~]# echo $?
    0
    
    [root@localhost ~]# echo $!
    
    [root@localhost ~]#

    位置变量,其实是预定义变量的一种,$0~$9,以及${N}。代表了执行脚本时的参数。

    如:假设我们有一个demo.sh脚本,当你执行 ./demo.sh p1 p2 p3 ..的时候,$0就是 ./demo.sh,$1就是p1,依次依此类推。

    但还有三个预定义变量,分别是 “*”/”@”/”#”,分别代表了所有参数(作为整体)、所有参数(作为数组)、参数个数!

    我们给定如下脚本  demo.sh:

    #! /bin/bash
    
    # 就示意前两个
    echo "执行的命令是:$0"
    echo "第一个参数是:$1"
    
    echo "参数的个数是:$#"
    
    # 这两个看起来一样,但用在for里面就能看出来了
    echo "所有参数是:$*"
    echo "所有参数是:$@"
    
    # 注意,要用双引号,否则就成了 for i in p1 p2 p3,和$@没区别了。。
    for i in "$*"
        do echo $i
        done
    
    echo "---"
    for i in "$@"
        do echo $i
        done
    [root@localhost]# ./demo.sh 11 22 33 44 55
    执行的命令是:./demo.sh
    第一个参数是:11
    参数的个数是:5
    所有参数是:11 22 33 44 55
    所有参数是:11 22 33 44 55
    11 22 33 44 55
    ---
    11
    22
    33
    44
    55
    
    [root@localhost]#


    自定义变量就不说了,同Java没啥区别。

    运算

    除了变量,接下来就是运算了,也就是表达式。

    不过,别扭的是,shell一切皆字符串,这点太难受了

    如:

    [root@localhost ~]# x=3
    [root@localhost ~]# y=4
    [root@localhost ~]# z=$x+$y
    [root@localhost ~]# echo $z
    3+4    #这里是拼接了字符串,即没有数值类型
    [root@localhost ~]# 
    [root@localhost ~]# z=$(($x+$y))
    7    #$(()) 这样才是计算,还有declare -i z=$x+$y或者 z=$( expr $x + $y ) 但都不如$(())方便!
    [root@localhost ~]#

    建议使用 “$(( 计算表达式 ))”这种方式,因为其他两种都不方便!

    不过要提一下declare!

    declare –i 是视为整数(注意,不是浮点数)

    declare –x 是导出为环境变量 (export就是这个的变体)

    declare –p 是打印出变量的定义

    declare –r 是设为只读(不能取消的那种。。。)

    更别扭的是,如果你想取消设置,那需要把上面的减号”-“变成加号”+” -- 但是对只读无效。。。

     

    上面是数值运算,接下来就是逻辑运算,也就是我们说的判断真假。

    shell的判断有点像JSP中的EL表达式,其定义的运算符可以执行相应的运算,如-ge/-gt/-le/-lt/-eq/-ne/!/-z/-n/-d/-f/-e等等。

    其实都是英文单词的首字母,很好理解也很好记 -- 除了 -z和-n,前者是为空判断,后者是非空判断,当成zero和not吧,太别扭了!

    逻辑运算也有两种格式:

    test –e “/root”    # 判断文件是否存在

    [ 11 –gt 22 ]             # 判断 11 是否 大于 22

    如何查看结果?可以通过 “echo $?”来查看!

    但是,还有更简单的,就是使用 && 和 ||,如下:

    test –e “/root”&& echo yes || echo no

    [ 11 –gt 22 ] && echo yes || echo no

    相等的判断,既可以用 ==,也可以用 -eq,不过后者仅能用于整数!

    需要说明的是,单个等号=,也可以用于判断相等,但容易引起误解,所以务必不要使用!


    运算之后,就该是控制语句了,我们都知道逻辑控制的三大语句if/for/while,shell都有。

    其实对于已经掌握了任意一门编程语言的人来说,这一块很简单,只不过换了个形式。

    if语句,例子:

    #!/bin/bash
    
    # 简单判断下本脚本的调用有没有附加参数,有的话输出下第一个参数
    # 这里的$1就是前面提到的位置变量 - 预定义变量之一
    if [ -z $1 ]
        then
            echo "你没有输入任何参数"
        else
            echo "你输入的第一个参数是:$1"
    fi
    #!/bin/bash
    
    # 简单示意下 if .. elif .. else
    file="/home/demo”
    if [ -d $file ]
        then    
            echo "$file 是一个目录"
    elif [ -f $file ]
        then    
            echo "$file 是一个文件"
    elif [ -e $file ]
        then    
            echo "$file 是存在的"
    else
        echo "file 不存在!"
    fi

    注意,不要忘了 thenfi


    for语句例子:

    #!/bin/bash
    
    # 列出某个路径下的文件 注意,不要把$ls用双引号括起来
    ls=$(ls /home/demo)
    for i in $ls
        do
            echo $i
        done
    
    
    # 求和:1... 100
    sum=0
    for ((i=1;i<=100;i++))
        do
                sum=$(( $sum+$i ))
        done
    echo $sum


    while语句例子:

    #!/bin/bash
    
    # 求和,1.. 100
    sum=0
    i=1
    while [ $i -le 100 ]
        do
            sum=$(( $sum+$i ))
            i=$(( $i+1 ))
        done
    
    echo $sum


    其实还有一个until,和while的判断刚好相反,没必要看了。

    还有一个case,个人觉得没必要看,也就算了。

  • 相关阅读:
    [转]vs2010 快捷键大全
    oracle 分组排序
    jqGrid如何实现单选。
    WCF 服务调用RFC 出现异常
    c语言修饰符总结const、static、volatile、auto、extern、register
    BL和LDR——位置无关码和位置相关码
    原码,反码,补码(二)
    原码补码反码
    C语言内存分布
    ARM总线架构(S3C2440)
  • 原文地址:https://www.cnblogs.com/larryzeal/p/7679623.html
Copyright © 2011-2022 走看看