zoukankan      html  css  js  c++  java
  • Shell入门

    Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

    Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

    shell脚本(shell script),是一种为shell编写的脚本程序。

    业界所说的shell通常都是指shell脚本,但shell和shell scrip是两个不同的概念。

    shell编程跟Java、PHP编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了

    Linux的shell种类总舵,常见的有:

    Bourne Shell(/usr/bin/sh或/bin/sh)

    Bourne Again Shell (/bin/bash)

    C Shell (/usr/bin/csh)

    ...

    在一般情况下,人们并不区分Bourne Shell 和 Bourne Again Shell,所以,想#!/bin/sh,它同样也可以改为#!/bin/bash。

    #!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。


    打开文本编辑器(可以使用vi/vim命令来创建文件),新建一个文件test.sh,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果用php写shell脚本,扩展名就用php好了。

    #!/bin/bash
    echo "Hello World !"

    #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell

    echo命令用于向窗口输出文本。


    运行shell脚本有两种方法:

    1.作为可执行程序

    将上面的代码保存为test.sh,并cd到相应目录:

    chmod +x ./test.sh   #使脚本具有执行权限
    ./test.sh #执行脚本

    注意,一定要写成./test.sh,而不是test.sh,运行其他二进制的程序也一样,直接写test.sh,Linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin , /sbin , /usr/bin , /usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用 ./test.sh告诉系统说,就在当前目录找。


    2.作为解释器参数

    这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

    /bin/sh test.sh
    /bin/php test.php

    这种方式运行的脚本,不需要再第一行指定解释器信息,写了也没用。


    定义变量时,变量名不加美元符号,如

    your_name="runoob.com"

    注意,变量名和等号之间不能有空格

    除了显式地直接赋值,还可以用语句给变量赋值,如:

    for file in 'ls /etc'
    或
    for file in $(ls /etc)

    以上语句将/etc下目录的文件名循环出来。


    使用变量

    使用一个定义过的变量,只要在在变量名前加美元符号即可,如:

    your_name="qinjx"
    echo $your_name
    或echo ${your_name}

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name

    这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)


    删除变量

    使用unset命令可以删除变量。

    unset variable_name

    变量被删除后不能再次使用,unsettle命令不能删除只读变量。

    #!/bin/bash
    myUrl="safdgsg"
    unset myUrl
    echo $myUrl

    以上实例执行将没有任何输出。


    shell字符串

    字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号,单引号的区别跟php类似。

    拼接字符串

    #!/bin/bash
    your_name="qinjx"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1

    输出:

    hello, qinjx ! hello, qinjx !

    获取字符串长度

    #!/bin/bash
    string="abcde"
    echo ${#string}   #输出为 5

    提取子字符串

    #!/bin/bash
    string="runoob is a great site"
    echo ${string:1:4}   #输出  unoo


    查找子字符串

    查找字符“i”或“s”的位置

    #!/bin/bash
    string="runoob is a great site"
    echo `expr index "$string" is`   #输出8

    注意:以上脚本中 ` 是反引号,而不是单引号‘ 


    shell数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小

    数组元素的下班由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值大于或等于0

    在shell中,用括号来表示数组,数组元素用空格符号分割开

    数组名=(值1 值2 ... 值n)
    或者
    array_name=(value0 value1 value2 value3)
    或者
    array_name=(
    value0
    value1
    value2
    value3
    )

    还可以单独定义数组的各个分量:

    array_name[0]=value0
    array_name[1]=value1
    array_name[n]=valuen

    可以不用连续的下标,而且下标的范围没有限制。


    读取数组

    读取数组元素值的一般格式是:

    ${数组名[下标]}

    使用@符号可以获取数组中的所有元素,例如:

    echo ${array_name[@]}

    获取数组的长度

    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    lengthn=${#array_name[n]}

    shell注释

    以#开头的行就是注释,会被解释器忽略。

    sh里没有多行注释,智能每行加一个#号

    #--------------------------------------------
    # 这是一个注释
    # author:菜鸟教程
    # site:www.runoob.com
    # slogan:学的不仅是技术,更是梦想!
    #--------------------------------------------
    ##### 用户配置区 开始 #####
    #
    #
    # 这里可以添加脚本描述信息
    # 
    #
    ##### 用户配置区 结束  #####

    shell传递参数

    可以在执行shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推。。。

    $0为执行的文件名。

    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    echo "Shell 传递参数实例!";
    echo "执行的文件名:$0";
    echo "第一个参数为:$1";
    echo "第二个参数为:$2";
    echo "第三个参数为:$3";

    为脚本设置可执行权限,并执行脚本,输出结果如下

    $ chmod +x test.sh 
    $ ./test.sh 1 2 3
    Shell 传递参数实例!
    执行的文件名:./test.sh
    第一个参数为:1
    第二个参数为:2
    第三个参数为:3

    shell基本运算符

    元素bash不支持简单的数学运算,但是可以通过其他命令来实现,例如awk和expr,expr最常用

    expr是一款表达式计算工具,使用它能完成表达式的求职操作。

    例如,两个数相加(注意使用的是反引号 ` 而不是单引号 ' )

    #!/bin/bash
    val=`expr 2 + 2`
    echo "两数之和 : $val"

    注意:表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2

              完整的表达式要被 ` ` 包含,注意这个字符不是单引号,而是反引号

    #!/bin/bash
    a=10
    b=20
    val=`expr $a * $b`
    echo "a * b : $val"
    
    
    if [ $a == $b ]
    then
       echo "a 等于 b"
    fi
    if [ $a != $b ]
    then
       echo "a 不等于 b"
    fi

    注意:称号 * 前面必须加反斜杠 才能实现乘法运算

             if...then...fi是条件语句

    原样输出字符串,不进行转义或取变量(用单引号)

    echo '$name"'
    
    输出:
    $name"


    显示命令结果

    echo `date`

    是反引号,显示当前日期

    Sun Jun 3 06:44:46 UTC 2018


    if语句语法格式:

    if condition
    then
        command1 
        command2
        ...
        commandN 
    fi

    if else语法格式:

    if condition
    then
        command1 
        command2
        ...
        commandN
    else
        command
    fi

    if lese if else语法格式:

    if condition1
    then
        command1
    elif condition2 
    then 
        command2
    else
        commandN
    fi

    for循环

    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done

    while语句

    while condition
    do
        command
    done

    until循环

    until循环执行一系列命令直到条件为true为止

    until condition
    do
        command
    done

    case

    shell case语句为多选择语句

    case 值 in
    模式1)
        command1
        command2
        ...
        commandN
        ;;
    模式2)
        command1
        command2
        ...
        commandN
        ;;
    esac
    #!/bin/bash
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1)  echo '你选择了 1'
        ;;
        2)  echo '你选择了 2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac


    Linux shell可以用户定义函数,然后再shell脚本中可以随便调用

    shell中函数的定义格式如下:

    [ function ] funname [()]
    
    {
    
        action;
    
        [return int;]
    
    }
    #!/bin/bash
    # author:菜鸟教程
    # url:www.runoob.com
    
    funWithReturn(){
        echo "这个函数会对输入的两个数字进行相加运算..."
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        echo "两个数字分别为 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"
    这个函数会对输入的两个数字进行相加运算...
    输入第一个数字: 
    1
    输入第二个数字: 
    2
    两个数字分别为 1 和 2 !
    输入的两个数字之和为 3 !

    函数返回值在调用该函数后通过$?来获得。

  • 相关阅读:
    前端历险记
    Pandas中空值的判断方法,包括数值型、字符串型、时间类型等
    【MySQL】explicit_defaults_for_timestamp 参数详解
    python并发编程--线程---从菜鸟到老鸟(一)
    远程jupyter+pycharm配置 (一)之安装与使用技巧
    airflow--Error: Already running on PID 22603 (or pid file '/home/rdev/airflow/airflow-webserver.pid' is stale)
    数仓调度研究-总论
    pandas实现hive的lag和lead函数 以及 first_value和last_value函数
    iOS开发小技巧--修改按钮内部图片和文字之间的间距(xib)
    iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!
  • 原文地址:https://www.cnblogs.com/Mayny/p/9374165.html
Copyright © 2011-2022 走看看