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

    一.shell编程

    1.1shell编程的基本介绍

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

    Shell也是一门编程语言<解释型的编程语言>,即shell脚本<就是在用linux的shell命令编程>

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

    1.2基本格式

    代码写在普通文本文件中,通常以 .sh为后缀名

    vi hello.sh

    #!/bin/bash    ## 表示用哪一种shell解析器来解析执行我们的这个脚本程序
    echo "hello world"   ##  注释也可以写在这里
    ## 这是一行注释

    执行脚本

    sh hello.sh

    或给脚本添加x权限,直接执行

    chmod 755 hello.sh

    ./hello.sh

    1.3 基本语法

    1.3.1 系统变量

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

    可以通过set命令查看系统变量

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

    1.3.2 自定义变量

    1、语法

    变量=值 (例如STR=abc)

    等号两侧不能有空格

    变量名称一般习惯为大写

    使用变量: $arg

    双引号和单引号有区别,①双引号仅将空格脱意,② 单引号会将变量引用比如$param脱意

    2、示例

    vi hello.sh进入编辑模式,

    STR="hello world"

    A=9

    echo $A

    echo $STR

    如果想打印 hello worlds is greater  怎么办?

    echo $STRs is greate 行吗?

    不行,正确写法是:

    echo ${STR}s is greate

    unset A 撤销变量 A

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

    执行结果:

    export  A   #可把变量提升为当前shell进程中的全局环境变量,可供其他子shell程序使用

    注意理解export,看下面示例:

    vi a.sh

    #!/bin/bash
    a="a in a.sh"
    echo $a
    /root/b.sh

    vi b.sh

    #!/bin/bash
    b="b in b.sh"
    echo $b
    echo $a

    分别赋操作 权限:chmod 755 a.sh   chmod 755 b.sh

    然后执行  ./a.sh ,会发现 b脚本中并没有把a脚本中定义的a变量打印出来

    如果要在b中打印出a脚本的变量a,需要在a脚本中把变量a做export定义

    此时,a变量就成了a.sh脚本所在bash进程的全局变量,该进程的所有子进程都能访问到变量a

    具体操作,修改a.sh, vi a.sh

    #!/bin/bash
    export a="a in a.sh"
    echo $a
    /root/b.sh

    执行./a.sh

    这次a的子进程b就能访问a进程的变量 了!

    另一种方式:

    如果在a.sh脚本中用如下方式调用b.sh

    .  ./b.sh    ## 注意:重点关注最前面那个 “.”号

    或者

    source ./b.sh

    则,b.sh就在a.sh所在的bash进程空间中运行

    总结:

    1、a.sh中直接调用b.sh,会让b.sh在a所在的bash进程的“子进程”空间中执行

    2、而子进程空间只能访问父进程中用export定义的变量

    3、一个shell进程无法将自己定义的变量提升到父进程空间中去

    4、“.”号执行脚本时,会让脚本在调用者所在的shell进程空间中执行

    3、反引号赋值

    A=`ls -la`    ## 反引号,运行里面的命令,并把结果返回给变量A

    A=$(ls -la)   ## 等价于反引号

    4、特殊变量

    $? 表示上一个命令退出的状态码

    $$ 表示当前进程编号

    $0 表示当前脚本名称

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

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

    $*和$@ 都表示参数列表  .`

    注:$*与$@区别

    $* 和 $@ 都表示传递给函数或脚本的所有参数

    ü  不被双引号" "包含时——

    $* 和 $@ 都以$1  $2  … $n 的形式组成参数列表

    ü  当它们被双引号" "包含时——

    "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式组成一个整串;

    "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表

    1.4 运算符

    1.4.1 算数运算

    1、用expr

    格式 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、用(())

    ((1+2))

    (((2+3)*4))

    count=1

    ((count++))

    echo $count

    但是要想取到运算结果,需要用$引用

    a=$((1+2))

    3、用$[]

    a=$[1+2]

    echo $a

    1.5 流程控制

    1.5.1 if语法

    1、语法格式

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

    2、示例
    #!/bin/bash
    read -p "please input your name:" NAME   ## read命令用于从控制台读取输入数据
    ## printf '%s\n' $NAME
    if [ $NAME = root ]
            then
                    echo "hello ${NAME},  welcome !"
            elif [ $NAME = likemebee ]
                    then
                            echo "hello ${NAME},  welcome !"
            else
                    echo "SB, get out here !"
    fi
    
    
    3、判断条件

    1/ 条件判断基本语法

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

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

    [ likemebee]

    #空返回false

    [  ]

     注意[  ]内部的=周边的空格,有区别:

    【未完待续……持续更新】

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/likemebee/p/7863083.html
Copyright © 2011-2022 走看看