• Shell教程快速入门


    Shell即是一种命令语言,又是一种程序设计语言,使用者可以通过Shell访问操作系统的内核服务。

    Shell编程和java、python、C一样,只要一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了,Linux的Shell种类众多,我们只关注与Bash(Bourne Again Shell  (/bin/bath))

    #! /bin/sh#! /bin/bash没多大区别,#!告诉系统需要什么解释器来执行该Shell脚本程序。

    shell的打印输出函数 echo

    从键盘获取输入信息---- read 

    read  name                   //从键盘数据保存在name变量中
    echo "从键盘获取的信息是 $name" 

    1、read命令提供了-p参数,-p后面的字符串会显示出来

    read -p "输入第一个数字:" a    #获取键盘输入的 a 变量数字
    read -p "输入第二个数字:" b    #获取键盘输入的 b 变量数字
    r=$[a+b]                    #计算a+b的结果 赋值给r  不能有空格
    echo "sum = ${r}"        #输出显示结果 r

    输出结果

    输入第一个数字:1
    输入第二个数字:2
    sum = 3

    2、计时输入

    使用read命令存在着潜在危险。脚本会阻塞下来等待用户的输入。如果无论是否输入数据脚本都必须继续执行,可以使用-t选项指定一个计时器。

    复制代码
    if read -t 5 -p "please enter your name:" name
    then
        echo "hello $name ,welcome to my script"
    else
        echo "sorry,too slow"
    fi
    复制代码

    3、设置read命令计数输入的字符。当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

    复制代码
    read -n1 -p "Do you want to continue [Y/N]?" answer
    case $answer in
    Y | y)
          echo "fine ,continue";;
    N | n)
          echo "ok,good bye";;
    *)
         echo "error choice";;
    esac
    复制代码

    使用了-n选项,后接数值1,指示read命令只要接受到一个字符就退出

    4、读文件

    还可以使用read命令读取Linux系统上的文件。每次调用read命令都会读取文件中的"一行"文本。当文件没有可读的行时,read命令将以非零状态退出。读取文件的关键是将文本中的数据传送给read命令,最常用的方法是对文件使用cat命令并通过管道将结果直接传送给包含read命令的while命令

    复制代码
    count=1    //赋值语句,不加空格
    cat test | while read line        //cat 命令的输出作为read命令的输入,read读到的值放在line中
    do
       echo "Line $count:$line"
       count=$[ $count + 1 ]          //注意中括号中的空格。
    done
    echo "finish"
    exit 0
    复制代码

    Shell单行注释 注释内容

    多行注释

    :<<EOF

    注释内容...

    注释内容...

    EOF

    EOF也可以使用其他字符,只要前后保持一致就行。

    运行 Shell 脚本有两种方法:

    1、作为可执行程序

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

    chmod +x ./test.sh  #使脚本具有执行权限
    ./test.sh  #在当前目录执行脚本test.sh

    2、作为解释器参数

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

    /bin/sh test.sh

    3、在Git Bash命令行中运行.sh文件

     $ sh test.sh

    Shell变量

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

    you_name="LXP-Never"

    变量名和等号之间不能有空格, 这和我们熟悉的python编程语言不一样,但是变量名的命名规则是一样的。

    使用变量

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

    name="LXP"
    echo $name
    echo ${name}

    变量名外面的花括号是可选的,加不加都行,如果加了花括号更加方便的识别变量的边界。推荐给所有的变脸加上花括号,这是一个好的编程习惯。

    只读变量  readonly name,只读变量的值不能被改变,不能被unset删除

    删除变量  unset name

    Shell字符串,字符串可以用单引号,也可以用双引号,也可以不用。但是使用双引号可以用$符号使用变量,还可以使用转义字符

    复制代码
    your_name="runoob"
    # 使用双引号拼接
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting  $greeting_1            # hello, runoob ! hello, runoob !
    # 使用单引号拼接
    greeting_2='hello, '$your_name' !'
    greeting_3='hello, ${your_name} !'
    echo $greeting_2  $greeting_3        # hello, runoob ! hello, ${your_name} !
    复制代码

    获取字符串长度

    string="abcd"
    echo ${#string}            # 4
    expr length "$string"    # 4

    提取子字符串

    以下实例从字符串第2个字符开始截取4个字符,取不到开始索引

    var="http://www.aaa.com/123.htm"
    echo ${string:1:4}     # ttp:

     从左边第几个字符开始,一直到结束,取不到开始索引

    echo ${var:7}    # is a great site

     从右边第几个字符开始,的几个字符

    echo ${var:0-7:3}    # 123

     从右边第几个字符开始,一直到结束。

    echo ${var:0-7}    # 123.htm

    Shell数组

    从0开始索引

    定义数组,用空格分割不同的数组元素

    array_name=(value1 value2 value3 ...valuen)

    读取数组

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

    ${数组名[下标]}

    valuen=${array_name[n]}

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

    echo ${array_name[@]}

    获取数组的长度

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

    截取

    ###号截取,删除边的字符  ${var#*//}  # 删除var左边的字符,直到遇到第一个//

    %%%号截取,删除边的字符  ${var%//*}  # 删除var左边的字符,直到遇到第一个//

    var=http://www.aaa.com/123.htm
    echo ${var#*//}    # www.aaa.com/123.htm
    echo ${var##*/}    # 123.htm
    echo ${var%/*}        # http://www.aaa.com
    echo ${var%%/*}    # http:

    关系运算符

    关系运算符只支持数字,不支持字符串

    a=10  b=20

    运算符说明举例

    -eq

    检测两个数是否相等,相等返回 true。

    [ aeqa−eq b ] 返回 false。

    -ne

    检测两个数是否不相等,不相等返回 true。

    [ anea−ne b ] 返回 true。

    -gt

    检测左边的数是否大于右边的,如果是,则返回 true。

    [ agta−gt b ] 返回 false。

    -lt

    检测左边的数是否小于右边的,如果是,则返回 true。

    [ alta−lt b ] 返回 true。

    -ge

    检测左边的数是否大于等于右边的,如果是,则返回 true。

    [ agea−ge b ] 返回 false。

    -le

    检测左边的数是否小于等于右边的,如果是,则返回 true。

    [ alea−le b ] 返回 true。

    文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。

    操作符说明举例
    -d file 检测文件是否是目录(在linux中目录就是文件夹的意思),如果是,则返回 true。 [ -d $file ] 返回 false。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。

    布尔运算符

    运算符说明举例

    !

    非运算

    [ ! false ] 返回 true。

    -o

    或运算

    [ alt20oa−lt20−o b -gt 100 ] 返回 true。

    -a

    与运算

    [ alt20aa−lt20−a b -gt 100 ] 返回 false。

    逻辑运算符

    运算符说明举例

    &&

    逻辑的 AND

    [[ a -lt 100 &&a -lt 100 && b -gt 100 ]] 返回 false

    ||

    逻辑的 OR

    [[ alt100||a−lt100|| b -gt 100 ]] 返回 true

    字符串运算符

    运算符说明举例

    =

    检测两个字符串是否相等,相等返回 true。

    [ a=a= b ] 返回 false。

    !=

    检测两个字符串是否相等,不相等返回 true。

    [ a!=a!= b ] 返回 true。

    -z

    检测字符串长度是否为0,为0返回 true。

    [ -z $a ] 返回 false。

    -n

    检测字符串长度是否为0,不为0返回 true。

    [ -n "$a" ] 返回 true。

    str

    检测字符串是否为空,不为空返回 true。

    [ $a ] 返回 true。

    Shell流程控制

    if else

    if condition1

    then

      command1

    elif condition2

    then

      command2

    else

      command3

    fi

    for循环

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

    while语句

    while condition
    do
      command
    done

    case

    Shell case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

    case num in
      1) command1

      ;;

      2) command2

      ;;
    esac

    跳出循环

    break、continue

    Shell函数

    funname(){

      echo "这是我的第一个Shell函数"

    }

    echo "调用函数"

    funname

    可以使用return返回函数

    函数参数

    在函数内部通过使用 $n 的形式来获取参数的值,例如,11表示第一个参数, 2表示第二个参数...

    复制代码
    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第十个参数为 ${10} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    复制代码

    输出结果:

    第一个参数为 1 !
    第十个参数为 10 !
    参数总数有 11 个!
    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

    注意,1010不能获取第十个参数,获取第十个参数需要 {10}。当n>=10时,需要使用${n}来获取参数。

    $#  传递到脚本的参数个数

    $*  以一个单字符串显示所有向脚本传递的参数

    shell文件导入

    . filename  # 注意点号(.)和文件名中间有一空格

    如:

    test1.sh文件内

    url="作者的名字是:"

    在test2.sh脚本文件内导入test1.sh脚本

    . ./test1.sh
    echo "${url}不告诉你"

    添加可执行权限并执行,然后执行test2.sh脚本,

    $ chmod +x test2.sh 
    $ ./test2.sh 
    作者的名字是:不告诉你

    参考文献

    linux菜鸟教程

    从键盘获取输入read

    作者:凌逆战
    欢迎任何形式的转载,但请务必注明出处。
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
    本文章不做任何商业用途,仅作为自学所用,文章后面会有参考链接,我可能会复制原作者的话,如果介意,我会修改或者删除。

    出处:https://www.cnblogs.com/LXP-Never/p/10203160.html

  • 相关阅读:
    Linux 安装 MysQl
    Linux上安装pip以及setuptools
    Linux 安装 python3
    基础 项目部署 上线
    wepsocket 了解一下
    scrapy之中间件
    scrapy之定制命令
    网络爬虫之scrapy框架设置代理
    爬虫之Xpath详解
    3.8软件测试模型
  • 原文地址:https://www.cnblogs.com/mq0036/p/12690644.html
Copyright © 2020-2023  润新知