shell脚本编程总结

  因为马上学习Hadoop和Spark,所以把shell脚本相关知识总结一下。

1.关于shell:

1.1.Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell.

2.Shell也是一门编程语言<解释型的编程语言>,即shell脚本.

3.一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的.
4.shell的语法有时候会变化,所以最好是使用最常用的算法!

2.shell 脚本的执行方式:

1. 输入脚本的绝对路径或相对路径首先要赋予+x权限,也就是可执行的权限:
  /root/helloWorld.sh
  ./helloWorld.sh
2. 不用赋予+x权限,而用解释器解释执行:
  sh  helloworld.sh
3. bash或sh +脚本
  sh /root/helloWorld.sh
  sh helloWorld.sh
4. 在脚本的路径前再加". "
  . /root/helloWorld.sh
  . ./helloWorld.sh 

区别: 前面三个会新开一个bash,不同bash中的变量无法共享!
注意:shell在linux中以bash的形式存在,并且可以同时存在多个shell进程。

3.shell中的变量:

Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看那系统变量.
系统变量:$HOME、$PWD、$SHELL、$USER等等.

set      显示当前shell中所有变量 

4.shell 脚本中的语法:

  1. 定义变量:变量=值 (例如STR=abc)
    注意事项:

    (1)等号两边不能有空格,也就是说STR = abc这种是不可以的。如果需要写空格,那么需要双引号来讲空格脱意。
    (2)变量名称一般习惯为大写
    (3)双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意。如下图:
    shell脚本编程总结_第1张图片

  2. 撤销变量: 例如A=9,撤销变量A则是unset A

    注意事项: (1)readonly B=2 声明静态的变量 B=2 ,不能 unset (不过readonly使用的很少!!)

  3. export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用。

    注意事项: source就是将profile中的export指令执行一遍。

  4. 将命令的返回值赋给变量:
    第一种: 使用反引号,就是在1旁边的波浪线那个键。例如:A=ls -la 反引号,运行里面的命令,并把结果返回给变量A 。
    第二种: A=$(ls -la) 等价于反引号

    注意事项:这个命令会很常用!

  5. shell中的特殊变量(常用的):

    注意,这些都是在编辑shell脚本的时候使用的,不是在常规命令行。

    $?   表示上一条命令输出的结果,也就是上一条命令的返回值。一般情况下,如果执行成功就返回0,失败的话返回的是非零值。
    $$   表示当前进程号
    $0   表示当前脚本名称
    $n   表示n位置的输入参数(n代表数字,n>=1) 就是在运行脚本时候传入的参数。
    $#      表示参数的个数,常用于循环
    $* 和 $@ 都表示参数列表。$*与$@区别:
        >(1)$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1  $2  … $n 的形式输出所有参数。
        >(2)当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
    

    $n示意:
    shell脚本编程总结_第2张图片
    这里写图片描述
    $@ 示范:
    shell脚本编程总结_第3张图片

  6. 运算符:(shell脚本中对于算数的需求并不大,但是还是要知道一下的)
    格式 :expr m + n 或$((m+n))

    注意expr运算符间要有空格(而且是必须有空格,一点都不能差!!!)

        例子:计算(2 +3 )×4 的值
            (1)分步计算    S=`expr 2 + 3` expr $S \* 4
            (2)一步完成计算
                    expr `expr 2 + 3 ` \* 4
                    echo `expr \`expr 2 + 3\` \* 4`
                    或 $(((2+3)*4)) 
    
  7. for循环:
    第一种:
    for N in 1 2 3
    do
    echo $N
    done

        或   for N in 1 2 3; do echo $N; done
    
        或  for N in {1..3}; do echo $N; done
    
    第二种:
    
            for ((i = 0; i <= 5; i++))
            do
                echo "welcome $i times"
            done
    
        或  for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done   
    
  8. while循环:

    第一种:
            while expression
            do
            command
            …
            done
    第二种:
            i=1
            while ((i<=3))
            do
            echo $i
            let i++
            done  
    
  9. case语句:
    格式:
    case $1 in
    first)
    echo “starting”
    ;;
    second)
    echo “stoping”
    ;;
    *)
    echo “Usage: {start|stop} “ #这个是默认的,如果都不匹配就是这个
    esac
  10. read 命令:用来在终端进行交互式输入的
    read -p(提示语句)-n(字符个数) -t(等待时间)
    read -p “please input your name: ” NAME
    例如:
    这里写图片描述

  11. if判断:
    语法
    if condition
    then
    statements
    [elif condition
    then statements. ..]
    [else
    statements …]
    fi
    实例:
    #!/bin/bash
    read -p “please input your name:” NAME
    #printf ‘%s\n’ NAMEif[ N A M E i f [ NAME = root ]
    then
    echo “hello NAME,welcome!elif[ N A M E , w e l c o m e ! ” e l i f [ NAME = itcast ]
    then
    echo “hello ${NAME}, welcome !”
    else
    echo “SB, get out here !”
    fi

  12. 判断语句:
    [ condition ] (注意condition前后要有空格)
    #非空返回true,可使用$?验证(0为true,>1为false)
    #空返回false

            [ condition ] && echo OK || echo notok
            条件满足,执行&&后面的语句;不满足就执行||后面的语句
    
    (1)常用判断条件:
                    = 字符串比较
                    -lt 小于
                    -le 小于等于
                    -eq 等于
                    -gt 大于
                    -ge 大于等于
                    -ne 不等于
    
    (2)常用判断条件:
                    -r 有读的权限
                    -w 有写的权限
                    -x 有执行的权限
                    -f 文件存在并且是一个常规的文件
                    -s 文件存在且不为空
                    -d 文件存在并是一个目录
                    -b文件存在并且是一个块设备
                    -L 文件存在并且是一个链接
    

    shell脚本编程总结_第4张图片
    13.shell自定义函数:
    语法:
    [ function ] funname [()] #注意:是不能接收参数的
    {
    action;
    [return int;]
    }

        三种写法:       function start()   
                        function start    #  可以不写括号,但是前面一定有function
                        start()         #前面没有function,所以括号必须写
        注意事项:
                1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。
                2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255) 
    

    shell脚本编程总结_第5张图片
    shell脚本编程总结_第6张图片
    注意:上面的虽然第一行报错,但是不影响下面的运行!
    14.脚本调试:
    sh -vx helloWorld.sh
    或者在脚本中增加set -x

上面是shell脚本的基本语法!

你可能感兴趣的:(Linux)