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

    1.什么是 Shell

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

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

    3.一个系统可以存在多个shell,可以通过cat /etc/shells 命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的

    2.Shell 脚本的执行方式  

    第一种: 输入脚本的绝对路径或相对路径(赋予执行权限)

    例如: 在/ zzy/ 目录下新建一个文件 

    touch helloworld.sh

    文件内容:

    赋予 执行权限 

     chmod +x helloworld.sh 

    运行:

    第二种: bash 或 sh + 脚本

    直接用解释器执行 

    sh helloworld.sh #相对路径

    sh /zzy/helloworld.sh #绝对路径

    第三种:在脚本的路径前再加 "."空格

     . /zzy/helloworld.sh #绝对路径
    . ./helloworld.sh #相对路径

    区别: 第一种和第二种方式会新开一个 bash, 不同 bash 种的变量无法共享

    3.Shell 中的变量

    Linux Shell 中的变量分为"系统变量"和"用户自定义变量"

    系统变量: $HOME, $PWD, $SHELL, $USER 等等

    显示当前 shell 中所有的变量 : set 

    4.定义变量

    1.变量=值(例如: A=abc)

    2.等号两侧不能有空格

    3.变量名称一般习惯为大写

    4.双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意.

    例如:

    y=bb
    x="hello $y" 
    echo $x

    双引号结果:

    y=bb
    x='hello $y'
    echo $x

    单引号结果:

    5.ZZY="hello world"

    6.A=10

    7.unset A 撤销变量 A

    8.readonly B=2 声明静态的变量 B=2 ,不能 unset

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

      注意:

      

    source /etc/profile

    是把 export 中的环境变量赋值一遍

    5.将命令的返回值赋给变量

    A=`ls -la`
    A=$(ls -la)

    6.Shell 中的特殊变量

    6.1 $? 表示上一个命令退出的状态,例如:

    通常情况下,命令成功为0.

    6.2 $$ 表示当前进程编号(用的不多)

    6.3 $0 表示当前脚本名称

    例:helloworld.sh 内容如下

    #!/bin/bash
    echo "this is $0"
    echo $0

    结果:输出脚本名称

    6.4 $n 表示 n 位置的输入参数( n代表数字, n >= 1)

    例:helloworld.sh 内容:

    #!/bin/bash
    echo 'this is $n'
    echo "第一个参数:="$1
    echo "第二个参数:="$2

    运行 :

     sh helloworld.sh  hello world

    结果:

    6.5 $# 表示参数的个数,常用语循环

    6.6 $* 和 $@ 都表示参数列表

    例:helloworld.sh 内容

    #!/bin/bash
    echo 'this is $#, $*, $@'
    aa="hello"
    echo '$#'
    echo $#
    echo '$*'
    echo $*
    echo '$@'
    echo $@

     for 循环遍历参数

    #!/bin/bash
    echo 'this is $#, $*, $@'
    aa="hello"
    
    echo '$*'
    for p in $*
    do echo $p
    done
    
    echo '$@'
    for p in $@
    do 
    echo $p
    done

    结果:

    6.7 $* 和 $@ 区别

      $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以$1 $2 … $n 的形式输出所有参数

      当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数 

    7.运算符

      格式 :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))

    8.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

    运行结果:

    9.while循环

     第一种:

    while true  # 表达式
    do
    echo "1"
    done

    第二种:

    i=1
    while ((i<=3))
    do
      echo $i
      let i++
    done

    10.case 语句

    编辑文件:testcase.sh

      

      常规的break是在每一项后面加;;

      无条件继续是在每一项后面加;&

      有条件继续实在每一项后面加;;&

    A="start"
    case $A in
    start)
            echo "starting"
            ;;
    stop)
            echo "stoping"
            ;;
    *)
            echo "Usage: {start|stop}"
    esac

    11.read 命令

    作用:提示用户命令

    read -p(提示语句)-n(字符个数) -t(等待时间) 
    
    read -p "please input your name: " NAME  #变量名为 NAME

    测试:

    12.if 语句

    语法:

    if condition 
    then 
        statements 
    [elif condition 
        then statements. ..] 
    [else 
        statements ] 
    fi

    [ condition ] (注意condition前后要有空格)

    #!/bin/bash
    read -p "please input your name:" NAME
    #printf '%s
    ' $NAME
    if [ $NAME = root ]
            then
                    echo "hello ${NAME},  welcome !"
            elif [ $NAME = zzy ]
                    then
                            echo "hello ${NAME},  welcome !"
            else
                    echo "SB, get out here !"
    fi

    常用判断条件-比较:

    = 字符串比较
    -lt 小于
    -le 小于等于
    -eq 等于
    -gt 大于
    -ge 大于等于
    -ne 不等于

    0为true,>1为false

    非空返回true,可使用$?验证(0为true,>1为false)
    [ zzy ]
    
    空返回false
    [  ]

    常用判断条件-文件

    -r 有读的权限
    -w 有写的权限
    -x 有执行的权限
    -f 文件存在并且是一个常规的文件
    -s 文件存在且不为空
    -d 文件存在并是一个目录
    -b文件存在并且是一个块设备
    -L 文件存在并且是一个链接

    例: 检测 testif.sh 文件是否存在

    13.shell 自定义函数

    语法:

     [ function ] funname [()]
    {
        action;
        [return int;]
    }
    
    function start()  / function start / start()

    例如:

    #!/bin/bash
    
    function fsum()
    {
     echo $1,$2;
     return $(($1+$2));
    
    }
    fsum 5 7;
    total=$?;
    echo $total,$?;

    输出:

    执行命令:sh testsum.sh  
    5,7
    12,0

    注意
    1.必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译,python 也不会预编译

    2.函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

    14.脚本调试

    sh -vx helloWorld.sh
    或者在脚本中增加set -x

    例如:

    #!/bin/bash
    set -x
    function fsum()
    {
     echo $1,$2;
     return $(($1+$2));
    
    }
    fsum 5 7;
    total=$?;
    echo $total,$?;

    输出:

    [root@dkh101 zzy]# sh testsum.sh     
    + fsum 5 7
    + echo 5,7
    5,7
    + return 12
    + total=12
    + echo 12,0
    12,0

     15.cut 命令

      详细请参考

    16.wc 命令

        wc 命令详解

    17.sort 命令

      sort与uniq命令详解 

    18 . Shell 自动化部署免密登录 

      详细请参考: Shell 自动化部署免密登录 

    19. Shell 自动安装 JDK

      详细请参考: Shell 自动安装 JDK 

    20. Shell远程执行命令 

      详细请参考:Linux Shell远程执行命令

    21.Shell 判断文件和文件夹是否存在

      详细请参考:Shell 判断文件和文件夹是否存在

    本部分属于一步一步学习大数据系列之 Linux 的章节,欢迎订阅更多文章

    更多内容请参考:一步一步学习大数据系列介绍

  • 相关阅读:
    [字符串] 洛谷 P2264 情书
    [IDA*] 洛谷 P2324 骑士精神
    [Tarjan] 洛谷 P2746 校园网
    [dp][瞎搞] 洛谷 P2501 数字序列
    [虚树][lca][dfs] 洛谷 P3233 世界树
    [斜率优化][dp] 洛谷 P3648 序列分割
    [带修莫队] Bzoj 2120 数颜色
    [数学][组合数] Jzoj P4257 着色
    [贪心][前缀和] Jzoj P4256 平均数
    [dfs] 洛谷 P2535 收集资源
  • 原文地址:https://www.cnblogs.com/chaoren399/p/6264337.html
Copyright © 2011-2022 走看看