• shell编程基础


    第一个shell脚本

    创建shell文件:
    vi test.sh
    第一个脚本:
    #! /bin/bash
    echo “Hello World!”
    保存:
    esc+:wq
    进入对应路径:
    cd 到相应路径
    执行程序:
    chmod+x ./test.sh #使得脚本具有执行权限
    ./test.sh # 执行脚本

    shell变量

    eg:your_name=“runoob.com”
    注意:变量名和等号之间不能有空格。
    变量名命名规则:
    1.命名只能使用英文,数字下划线,首字母不能以数字开头
    2.中间不能有空格,可以使用下划线
    3.不能使用标点符号
    4.不能使用bash里面的关键字

    eg:将/etc下目录的文件名循环出来
    for file in ‘ls /etc’
    for file in $(ls /etc)

    使用变量

    使用一个定义过的变量,只要在变量名前面加上美元符号
    eg:
    your_name=“qinjx”
    echo $your_name
    echo ${your_name}
    {}花括号帮助解释器识别变量的边界(给变量加上{}好习惯)
    eg
    for skill in Ada Coffe Action Java:do
    echo “I am good at ${skill}Script”
    done
    eg
    your_name=“tom”
    echo $your_name
    $your_name=“alibaba”
    echo $your_name

    只读变量

    readonly命令可以将变量定义为只读变量,只读变量的值不能改变
    eg
    #! /bin/bash
    myurl=“https://www.google.com”
    readonly myurl

    删除变量

    unset命令可以删除变量,
    unset variable_name
    变量删除后不能再次使用,unset命令不能删除只读变量,
    #! /bin/bash
    myurl=“https://www.runoob.com”
    unset myurl
    echo $myurl

    变量类型

    局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
    环境变量:所有的程序,包括shell启动的程序都能访问环境变量,有些程序需要环境变量来保证其运行,必要时候shell脚本可以定义环境变量
    shell变量:shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    shell字符串

    字符串可以用单引号,可以用双引号,也可以不用引号


    单引号:str='this is a string' 单引号字符串的限制:单引号的任何字符都会原样输出,单引号中字符串中的变量是无效的。
    双引号 : eg: your_name="runoob" str="Hello ,I know you are \"$your_name\"! \n" echo -e $str 双引号里面可以有变量 双引号里可以出现转义字符

    拼接字符串

    eg
    your_name=“runoob”
    greeting=“hello,”$your_name" !"
    greeting_1=“hello, ${your_name}!”
    echo $greeting $greeting_1

    获取字符串长度

    string=“abcd”
    echo ${#string}

    提取字符串

    以下实例从字符串第2个字符开始截取4个字符
    eg
    string=“runoob is a great site”
    echo ${string:1:4}

    查找子字符串

    查找字符i或者o的位置,(哪个字母先出现就计算哪个)
    string=“runoob is a great site”
    echo 'expr index “$string” io`

    shell数组

    bash支持一维数组,不持支多维数组,没有限定数组大小,数组下表从o开始,

    定义数组

    eg:
    array_name=(value0 value1 value2 value3)
    or
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    array_name[3]=value3

    读取数组

    读取数组元素格式:${数组名[下标]}
    @可以获取数组中所有元素:
    echo ${array_name[@]}

    获取数组长度

    获取数组元素的个数:
    length=$ {#array_name[@]}
    length=$ {#array_name[*]}
    获取数组单个元素的长度
    length=${#array_name[n]}

    注释

    单行注释: #开头
    多行注释:
    :< 注释文字
    EOF

    shell参数传递

    执行shell脚本时,向脚本传递参数,脚本内获取参数的格式是:$n
    向脚本传递三个参数,并分别输出,其中 $0为执行的文件名
    eg
    #! /bin/bash
    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数组

    eg创建一个简单的数组:my_array
    my_array=(A B “C” D)
    读取数组:
    echo “第一个元素为:$ {my_array[0]}”
    echo “第二个元素为:$ {my_array[1]}”
    echo “第三个元素为:$ {my_array[2]}”
    echo “第四个元素为:$ {my_array[3]}”
    执行脚本:
    chmod +x test.sh
    ./test.sh

    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2

    Shell基本运算符

    运算符包括:算数,关系,布尔,字符串,文件测试
    eg
    #! /bin/bash
    val=反引号expr 2 + 2反引号
    echo “两个数之和为:$val”
    注意:表达式和运算符之间有空格,``反引号的使用

    • expr $a + $b
      在这里插入图片描述
      eg
      a=10
      b=20
      val=expr $a + $b
      echo “a + b :$val”

    val=expr $a- $b
    echo “a - b : $val”

    val=expr $a \* $b
    echo “b / a :$val”

    if [ $a == $b]
    then
    echo “a 等于 b”
    fi

    if[ $a != $b]
    then
    echo “a 不等于 b”
    fi

    注意:
    *乘号前面必须加\才能运行
    if
    then
    fi

    关系运算符

    关系运算符只支持数字
    在这里插入图片描述

    if [ $a -eq $b]
    then
    echo " $a -eq $b:a 等于 b"
    else
    echo " $a -q $b:a 不等于 b"
    fi

    两个数是否相等-eq
    两个数是否不等-ne
    左边的数是否大于右边-gt
    左边的数是否小于右边-lt
    左边的数是否大于等于右边-ge
    左边的数是否小于等于右边-le

    布尔运算

    在这里插入图片描述

    or,and

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

    逻辑运算符

    && 逻辑的AND
    || 逻辑的OR
    eg
    #! /bin/bash
    a=10
    b=20
    if [[ $a -lt 100 && $b -gt 100 ]]
    then
    echo “返回true”
    else
    echo " 返回false"
    fi

    if [[ $a -lt 100 || $b -gt 100 ]]
    then
    echo “返回true”
    else
    echo “返回false”
    fi

    字符串运算符

    在这里插入图片描述
    a=“abc”
    b=“efg”
    if [ $a = $b ]
    then
    echo " $a = $b:a 等于 b"
    else
    echo " $a = $b:a 不等于 b"
    fi

    if [ $a != $b]
    then
    echo " $a 1= $b :a 不等于 b"
    else
    echo " $a != $b :a 等于 b"
    fi

    文件测试运算符

    在这里插入图片描述

    echo命令

    1显示普通字符:
    echo “It is a test”
    2显示转义字符:
    echo “” It is a test""
    3显示变量
    vi test.sh

    #! /bin/bash
    read name
    echo “$name It is a test”

    sh test.sh
    OK
    OK It is a test

    4显示换行
    echo -e “OK! \n”
    echo “It is a test”

    5显示不换行
    #! /bin/bash
    echo -e “OK! \c”
    echo “It is a test”
    输出结果:OK!It is a test

    6显示结果定向至文件
    echo “It is a test”> myfile

    7原样输出字符串,不进行转义或取变量(用单引号)
    echo '$name" ’
    输出结果: $name/"

    8显示命令执行结果
    echo ‘date’

    printf

    printf format-string [arguments…]
    format-string 格式控制字符串
    arguments 参数列表

    eg
    $ echo “Hello.Shell”
    Hello,Shell

    $ printf “Hello,Shell\n”
    Hello,Shell

    printf "%-10s %-8s %-4s\n"姓名 性别 体重kg
    printf "%-10s %-8s %-4.2s\n"郭靖 男 66
    printf "%-10s %-8s %-4.2s\n"杨过 男 47
    printf "%-10s %-8s %-4.2f\n"芙蓉 女 46

    格式替代符:%s,%c,%d,%f
    %s输出一个字符串
    %d整型输出
    %c输出一个字符
    %f输出实数,以小数形式输出

    %-10s :指的是宽度为10个字符,-表示左对齐
    %-4.2f :指格式化为小数,其中.2保留2位小数

    printf转义字符

    在这里插入图片描述
    $ printf “a string , no processing:<%s>\n” “A\nB>”

    a string , no processing:< A

    $ printf " a string,no processing:<%b>\n “A\n”
    a string , processing:< A
    B >

    $ printf " www.runoob.com \a"
    www.runoob.com $

    test命令

    test命令可以用于检查某个条件是否成立,它可以进行数值,字符,文件三方面测试
    在这里插入图片描述
    eg
    num1=100
    num2=100
    if test $[num1] -eq $[num2]
    then
    echo ‘两个数相等’
    else
    echo’两个数不相等’
    fi

    eg
    #! /bin/bash
    a=5
    b=6
    result=$[a+b]
    echo “result为: $result”

    字符串测试

    在这里插入图片描述
    num1=“ru1noob”
    num2=“runoob”
    if test $ num1=$ num2
    then
    echo ‘两个字符串相等’
    else
    echo ‘两个字符串不等’
    fi

    文件测试

    在这里插入图片描述
    eg
    cd /bin
    if test -e ./bash
    then
    echo ‘文件已经存在’
    else
    echo ‘文件已经不存在’
    fi

    shell流程控制

    if else
    fi

    if condition
    then
    command1
    command2
    command3
    fi

    if condition1
    then
    command1
    elif condition2
    then
    command2
    elif condition3
    then
    command3
    else
    commandN
    fi

    if else-if else
    if condition1
    then
    command1
    elif condition2
    then
    command2
    elif condition3
    then
    command3
    else
    commandN
    fi

    条件判断:大于使用-gt
    小于使用-lt

    使用[[ ]]作为判断语句,大于小于可以直接使用><
    if (( a > b ));then

    fi

    eg
    a=10
    b=20
    if [ $a == $b]
    then
    echo “a 等于 b”
    elif [ $a -gt $b ]
    then
    echo “a 大于 b”
    elif [ $a -lt $b ]
    then
    echo “a 小于 b”
    else
    echo “没有符合的条件”
    fi

    a=10
    b=20
    if (( $a == $b))
    then
    echo “a 等于 b”
    elif (( $a > $b))
    then
    echo “a 大于 b”
    else
    echo “没有符合的条件”
    fi

    eg
    num1=$ [2*3]
    num2=$ [1+5]
    if test $[num1] -eq $[num2]
    then
    echo ‘两个数字相等’
    else
    echo ‘两个数字不相等’
    fi

    for循环

    for var in item1 item2 item3 …itemN
    do
    command1
    command2
    command3
    done
    for循环执行一次所有命令,使用变量名获取列表中当前取值。命令可为任何有效的shell命令和语句,in列表可以包含替换,字符串和文件名
    eg
    for loop in 1 2 3 4 5
    do
    echo “The value is : $loop”
    done

    eg顺序输出字符串:
    #! /bin/bash
    for str in This is a string
    do
    echo $str
    done

    while语句

    while condition
    do
    command
    done

    以下是一个基本的while循环,测试条件是,如果int小于等于5,那么条件返回真,int从1开始,每次循环处理时,int加上1,运行上述脚本,返回数字1-5,然后终止。

    #! /bin/bash
    int=1
    while(( $int<=5 ))
    do
    	echo $int
    	let "int++"
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    case…esac

    多选择语句
    ;;表示break

    case 值 in
    模式1)
    command1
    command2
    commandN
    ;;
    模式2)
    command1
    command2
    commandN
    ;;
    esca

    无一匹配用*捕获该值

    echo '请输入1-4之间的数字'
    echo '您输入的数字是:'
    read aNum
    case $aNum in
    	1) echo '你选择了1'
    	;;
    	2) echo '你选择了2'
    	;;
    	3) echo '你选择了3'
    	;;
    	4) echo '你选择了4'
    	;;
    	*) echo '你没有输入1-4之间的数字'
    	;;
    esca
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    eg脚本匹配字符串

    #! /bin/bash
    
    site="runoob"
    
    case "$site" in
    	"runoob") echo "菜鸟教程"
    	;;
    	"google") echo "Google 搜索"
    	;;
    	"taobao") echo "淘宝网"
        ;;
    esca
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    跳出循环

    循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,shell使用两个命令来实现:
    break continue

    break

    #! /bin/bash
    while:
    do
    	echo -n "输入1-5之间的数字:"
    	read aNum
    	case $aNum in
    	1|2|3|4|5)echo "你驶入的数字为:$aNum"
    	;;
    	*) echo "你输入的数字不是1-5之间的数字,游戏结束"
    	break
    	;;
    	eaca
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    continue

    仅跳出当前循环

    #! /bin/bash
    while :
    do 
    	echo -n "输入1-5之间的数字:"
    	read aNum
    	case $aNum in
    	1|2|3|4|5) echo "你输入的数字是 $aNum"
    	;;
    	*) echo "你输入的数字不是1-5之间的"
    	continue
    	echo "游戏结束"
    	;;
    	eaca
    done
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    "游戏结束"永远不会执行

    shell函数

    函数格式:
    [ function ] funname [()]
    {
    action:
    [return int;]
    }

    #! /bin/bash
    demoFun(){
    	echo "这是我的第一个shell函数"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    eg

    #! /bin/bash
    
    funWithReturn(){
    	echo "这个函数会对输入的两个数字进行相加运算。。。。"
    	echo "输入第一个数字:"
    	read aNum
    	echo "输入第二个数字"
    	read anotherNum
    	echo "两个数字分别是 $aNum$anotherNum !"
    	return $(($aNum + $anotherNum))
    }
    funWithReturn
    echo "输入的两个数字适合为 $? !"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    #! /bin/bash
    funwithParam(){
    	echo "第一个参数为 $1"
    	echo "第二个参数为 $2"
    	echo "第十个参数为 $10"
    	echo "第十个参数为${10}"
    	echo "第十一个参数为 ${11}"
    	echo "参数总数有 $# 个"
    	echo "作为一个字符串输出所有参数 $*"
    }
    funwithParam 1 2 3 4 5 6 7 8 9 34 73
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    shell输入/输出重定向

    在这里插入图片描述

    输出重定向:>(输出重定向会覆盖文件内容)

    command1 > file1
    执行command1然后将输出的内容存入file1
    file1内部已经存在的内容被新内容替代

    eg
    who > users
    没有在终端输出信息,因为输出已经被从默认的标准输出设备重定向到指定的文件。
    cat users

    echo “菜鸟教程:www.runoob.com”>users
    cat users

    使用 > >追加到文件末尾,可以不覆盖文件内容

    输入重定向<

    command1 < file1
    这样,原本需要从键盘获取输入的命令会转移到文件读取内容。

  • 相关阅读:
    TensorFlow 用 hashtable 的意义
    粒子群算法(PSO)优化双向长短期记忆神经网络的数据分类预测,PSO-BiLSTM分类预测,多输入单输出模型
    vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
    HarmonyOS云开发基础认证---练习题二
    关于python中自带的类似postman的工具
    java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计
    【算法基础】双指针
    singularity build用法详解,及实例
    chrome谷歌浏览器离线安装axure插件打开页面原型
    pytest自动化测试指定执行测试用例
  • 原文地址:https://blog.csdn.net/weixin_43366437/article/details/126094385