shell脚本-字符串和变量

本文详细介绍了Shell脚本中的变量类型,包括局部变量、环境变量和shell变量,以及位置变量和特殊变量的使用。讲解了变量定义、赋值、删除的规范和方法。此外,还深入探讨了字符串的处理,如引号的区别、字符串提取、替换和比较。通过实例展示了如何在脚本中操作和管理字符串。
摘要由CSDN通过智能技术生成

变量、字符串

  • 定义变量+查看变量值

    name=jerry    
    #定义变量值
    # echo $name  
    jerry
    #查找变量值
    
  • 变量类型:运行shell时,会同时存在三种变量

    • 局部变量:仅在当前shell实例中有效,其他shell启动程序不能访问局部变量,通常用于函数本地

      local VAR_NAME=VALUE
      
    • 环境变量:所有的程序,包括启动shell的程序,都能访问环境变量

      ##对当前shell进程及其子shell有效,对其它的shell进程无效   
      定义:export VAR_NAME=VALUE
      导出:export VAR_NAME
      撤消变量:unset VAR_NAME
      只读变量:readonly VAR_NAME
      
    • shell变量:由shell程序设置的特殊变量,其中有一部分是环境变量,有一部分是局部变量

       $1,$2...,${10}
        ## 如下执行脚本a.sh
        bash a.sh 1 2 3
        ## $1即为第一个参数1  $2及为第二个参数 2
      
      • 位置变量:用来接收变量指定位置的参数

      • 特殊变量:shell对一些参数做特殊处理,这些参数只能被引用而不能被赋值

        $#  传递到脚本的参数个数
        $*  显示所有向脚本传递的参数                  #与位置变量不同,此选项参数可超过9个
        $$  获取当前shell的进程号
        $!  执行上一个指令的进程号
        $?  获取执行的上一个指令的返回值              #0为执行成功,非零为执行失败
        $-  显示shell使用的当前选项,与set命令功能相同
        $@$*相同,但是使用时加引号,并在引号中返回每个参数
        

定义变量规范

  • 变量名可以由字母、数字和下画线组成,但是不能以数字开头,不能使用程序中的关键字(保留字),要见名知义。如果变量名是"20name或者if",则是错误的

  • 在 Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型

    [root@localhost ~]# aa=1+2
    [root@localhost ~]# echo $aa
    1+2
    #可见输出类型为字符串“1+2”,而不是3
    
  • 变量用等号"=“连接值,”="左右两侧不能有空格

  • 变量值中如果有空格,则需要使用单引号或双引号包含,如 test=“hello world!”。双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符。

  • 在变量值中,可以使用转义符"\"

  • 如果需要増加变量值,那么可以进行变量叠加。 l例如:

    [root@localhost ~]#test=123
    #叠加变量test,变量值变成了123456
    [root@localhost ~]#test=${test}456
    [root@localhost ~]# echo $test
    123456
    
  • 如果要把命令的执行结果作为变量值赋予变量,则需要使用反引号或 $() 包含命令。例如

    ##$()引用执行结果
    [root@localhost ~]# test=$(date)
    [root@localhost ~]# echo $test
    Tue Feb 4 14:50:45 CST 2020
    ##反引号 引用执行结果
    root@Test-old-web01:~# test=`date`
    root@Test-old-web01:~# echo $test
    Tue Feb 4 14:51:19 CST 2020
    
  • 环境变量名建议大写,便于区分。

删除变量

使用unset 永陵可以删除变量

unset variable_name

变量删除后不能再次使用。unset命令不能删除只读变量,readonly定义的变量叫做只读变量

#!/bin/sh
myUrl="http://www.educoder.net"
unset myUrl
echo $myUrl 
##输出为空,是因为myurl已经被删除了 

字符串

  • 引号的区别

    • 无引号:依次输出
    #! /bin/bash
    var="aaa 
    bbb 
    ccc"
    echo ${var}
    ##输出结果为
    aaa bbb ccc
    
    • 单引号 :无法解析变量,只会原样输出
    #! /bin/bash
    var="aaa 
    bbb 
    ccc"
    echo '${var}'
    ##输出结果为
    ${var}
    ###单引号无法解析变量,只会原样输出
    
    • 双引号:和原来一样的输出
    #! /bin/bash
    var="aaa 
    bbb 
    ccc"
    echo "${var}"
    ##输出结果为
    aaa
    bbb
    ccc
    
    • 反引号
    例1
    $ echo the date is `date`
    the date is Tue Feb 4 18:08:12 CST 2020
    #这里的反引号 `date` 及为命令"date" 的结果,因此像引用一个命令返回的结果作为变量用 反引号 替换,也可以使用 $(date)的方式来替换使用命令结果
    
    
    例2
    $ abc=`echo The number of users is \`who| wc -l\``
    $ echo $abc
    The number of users is 4
    ## 这里 `who|wc -l` 是指 返回的正在登录系统的用户的个数的结果 为4
    ## 因为反引号嵌套了反引号,所以在需要加上\转义
    

字符串基本使用用法


请添加图片描述

  • 字母串提取测试

    • 获取长度
    string="abcdefg"
    echo ${#string}
    
    • 截取子串:从0 开始算
    ${string:position}    #在$string中, 从位置$position开始提取子串
    ${string:position:length}    #在$string中, 从位置$position开始提取长度为$length的子串
    
    string="abc12342341" 
    echo ${string:4}      #2342341  从第4位开始截取后面所有字符串    
    echo ${string:3:3}    #123      从第3位开始截取后面3位    
    echo ${string:3:6}    #123423   从第3位开始截取后面6位    
    echo ${string: -4}    #2341  :右边有空格   截取后4位    
    echo ${string:(-4)}   #2341  同上
    echo ${str:(-6):5}    #34234 从倒数第6个位置向左提取5个字符字符串
    
    # 从string字符串左边第一次出现*chars的位置开始,截取*chars右边的所有字符
    ${string#*chars}
    # 从string字符串左边最后一次出现*chars的位置开始,截取*chars右边的所有字符
    ${string##*chars}
    # 从string字符串右边第一次出现chars*的位置开始,截取chars*左边的所有字符
    ${string%chars*}
    # 从string字符串右边最后一次出现chars*的位置开始,截取chars*左边的所有字符
    ${string%%*chars*}
    
    • 字符串删除
    ${string#substring}     #从变量$string的开头, 删除最短匹配$substring的子串
    ${string##substring}    #从变量$string的开头, 删除最长匹配$substring的子串
    ${string%substring}     #从变量$string的结尾, 删除最短匹配$substring的子串
    ${string%%substring}    #从变量$string的结尾, 删除最长匹配$substring的子串
    
    test='c:/windows/boot.ini'
    $ echo ${test#/} #(从头匹配斜杠/,删除匹配到最短的斜杠,没有匹配到,所以没有删除)
        c:/windows/boot.ini
    $ echo ${test#*/}  #(删除 从头匹配删除匹配到最短以/结尾的字符串,*是匹配0个或者多个)
        windows/boot.ini
    $ echo ${test##*/} #(删除 从头匹配匹配到最长的以/结尾的字符串,通常可以用来获取到文件名)
        boot.ini
    $ echo ${test%/*} #(删除 从尾部匹配以/开始最短的字符串,通常可以获取到文件路径前缀)
        c:/windows
    $ echo ${test%%/*} #(删除 从尾部匹配以/开始最长的字符串)
        c:
    
    • 字符串替换
    表达式规则
    ${string/substring/replacement}  #使用$replacement, 来代替第一个匹配的$substring
    ${string//substring/replacement} #使用$replacement, 代替所有匹配的$substring
    ${string/#substring/replacement}    
    #如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    ${string/%substring/replacement}    
    #如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    
    #测试列子:
    str="apple, tree, apple tree"
    echo ${str/apple/APPLE}   # 替换第一次出现的apple
    APPLE, tree, apple tree
    echo ${str//apple/APPLE}  # 替换所有apple
    APPLE, tree, APPLE tree
    echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它
    APPLE, tree, apple tree
    echo ${str/%apple/APPLE}  
    # 如果字符串str以apple结尾,则用APPLE替换它(str是以tree结尾的)
    apple, tree, apple tree
    
    #测试列子2:
    $ test='c:/windows/boot.ini'  
    $ echo ${test/\//\\}  
    #(匹配的为\/,匹配的子串/需要转义,所以添加\,同理替换的字符串\转义为\\)
    c:\windows/boot.ini  
    $ echo ${test//\//\\}  
    c:\windows\boot.ini 
    #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。
    
    • 字符串比较:四种判断方式 == != < > (按 ascii 值比较大小), == 相等则为真,!= 不相等则为真
    #字符串比较   
    str="bacd"
    ##判断字符串是否相等 这里的== 也可以换做 =  但是一般情况下使用== 
    if [ "$str"x == "abcdsd"x ]; 
    then
        echo "相等"
    fi
    ##不相等则为真
    if [ "$str"x != "abcdsd"x ]; 
    then
        echo "不相等"
    fi
    ##注意  比较字符串是否相等,可以字符串后面+上个别的字符,如果str为空的话,可以防止表达式报错:[: =: unary operator expected
    

第一关

cd /opt/
vi test.sh
echo "Hello EduCoder"
#退出vim  Ctrl+c :wq
chmod +x /opt/test.sh

第二关

cd /opt/
vi test2.sh
echo "$#"
echo "$1"
#退出vim  Ctrl+c :wq
chmod +x test2.sh
./test2.sh "www" "educoder" "net"

第三关

##1、str1 为 替换string1中第一次出现的 "Hello"为"hello"后的字符串
str1=${string1/Hello/hello}
##2、str2 为 替换string1中所有的"Hello"为"hello"后的字符串
str2=${string1//Hello/hello}
##3、str3 为 删除string1中的字符串"Kubernetes,"后的字符串
str3=${string1/Kubernetes,}
length=${#string1}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值