zoukankan      html  css  js  c++  java
  • Shell变量

      与其他语言不同,在Shell编程中,变量是非类型性质的,不必指定变量是数字还是字符串。

    1、变量类型

      Linux的Shell编程支持以下3种类型

    (1)用户自定义变量。它是在编写Shell脚本时定义的,可以在Shell程序内任意使用和修改。可以将它看作局部变量,仅在当前的Shell实例中有效,其他Shell启动的程序不能访问这种变量。

    (2)环境变量。作为系统的一部分,不必去定义他们,可以在Shell程序中使用他们,某些变量(如PATH)可以在Shell中加以修改。

    (3)内部变量。这是Linux系统所提供的一种特殊类型的变量。此类变量在程序中用来做出判断。在Shell程序中,这类变量的值是不能修改的。常见的内部变量有$#(传送给Shell程序的位置参数的数量)、$?(最后命令完成码或者在Shell编程内部执行的Shell程序的返回值)、$0(Shell程序的名称)、$*(调用Shell程序时所传送的全部参数组成的单字符串)。

    2、变量赋值和访问

      Shell支持自定义变量。

    1、变量定义

      Shell编程中使用变量无需事先声明,给变量赋值的过程也就是定义一个变量的过程。变量的定义很简单,一般形式为

    变量名=值

      定义变量时,变量名不加"$"符号。在赋值符号的两边不允许有任何空格,如果值中含有空格,制表符或换行符,则要将这个字符串用引号括起来。在同一个变量中,可以一次存放整型值,下一次再存储字符串。

      变量名的命名应当遵守如下规则:

    1、首个字符必须为字母。

    2、中间不能有空格,可以使用下划线(_)。

    3、不能使用标点符号。

    4、不能使用Shell关键字。

    下面给出一个示例

    #将一个数字赋值给变量x
    
    x=8
    
    #将一个字符串赋值给变量hello
    
    hello="hello world"
    

      注意赋值时变量名前不能加"$"号。

    还可以用一个变量给另一个变量赋值。格式如下

    变量2=$变量1

    2、变量访问

      如果要访问变量值,可以在变量名前加"$“即可。通常使用函数echo来显示变量,例如

    #将一个数字赋值给变量x
    x=8
    #将一个字符串赋值给变量hello
    hello="hello world"
    #显示hello的值
    echo $hello

    运行结果

      有些时候为了避免变量名与其他字符串混淆,需要为变量名加上{}。例如

    #将一个字符串赋值给变量skill
    skill="shell"
    #变量显示在字符中
    echo "i am good at ${skill} script"

      给所有变量加上{}是一个好习惯。

    3、只读变量

      使用readonly命令可以将变量定义为只读变量,只读变量不能被改变。例如

    hello="helloworld"
    #将该变量定义为只读
    readonly hello

    4、删除变量

      使用unset命令可以删除变量。语法如下:

    unset 变量名
    

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

    5、添加环境变量

      可以使用export命令将环境变量添加到环境中,作为临时的环境变量(一种全局变量)。基本用法如下:

    export 变量名=变量值
    

      该变量只在当前的Shell或其子Shell下有效,一旦Shell关闭了,变量就失效了,再打开新的Shell时,该变量就不存在了,如果需要使用,还需要重新定义。如果希望环境变量永不失效,则需要编辑配置文件(/etc/profile)。

      export命令仅将变量加到环境中,如果要从程序的环境中删除该变量,则可以使用unset命令或者env命令,env也可临时的改变环境变量值。

    3、内部变量

      常用的内部变量如下

    例如,执行以下命令可以查看当前的Shell进程ID

    4、位置参数

       上面内部变量中有几个表示运行脚本时传递给脚本的参数,通常称为位置参数或命令行参数。当编写一个带有若干参数的Shell脚本时,可以用命令行或从其他的Shell脚本调用它。位置参数使用系统给出的专用名,存放在变量中的第1个参数名为1,可以使用$1来访问,以此类推。当参数超过10个时,要用花括号将参数序列括起来,如${12}。

      $0是要给比较特殊的位置参数,用于表示脚本自己的文件名。$*和$@都表示传递给函数或脚本的所有参数。$#是指传递参数的个数。

    下面给出一个示例,用于显示位置参数。

    #!/bin/bash
    echo "脚本文件名:$0"
    echo "第一个参数:$1"
    echo "第二个参数:$2"
    echo "引用值:$@"
    echo "引用值$*"
    echo "参数个数:$#"

    将该脚本文件保存为example4后,如下方法运行传递参数。

      调用Shell程序可以省略位置居后的位置参数。例如,Shell程序要求两个参数,可以只用第一个参数来调用,但是不能只利用第2个参数来调用。对于省略的较高位置参数,Shell将其视为空字符串处理,如上上面同样的字符可以这样运行

      $*和$@在不被双引号" "包含时,都以"$1"、"$2"..."$n"的形式输出所有参数。但是当他们被包含时,"$* "会将所有参数作为一个整体,以"$1$2....$n"的形式输出所有参数。"$@”会将各个参数分开,还是按"$1"、"$2"..."$n"的形式输出。

       

      在Shell程序中,可以利用set命令为位置参数赋值或重新赋值。set命令的一般格式为

    set [参数列表]
    

      该命令后面无参数时,将显示系统中的系统(环境)变量值;如果有参数,将分别给位置参数赋值,多个参数见用空格隔开。例如在上面脚本中第一行加上以下语句,从命令行提供的位置参数将被set所赋值取代。

    set QQQ PPP
    #!/bin/bash
    echo "脚本文件名:$0"
    echo "第一个参数:$1"
    echo "第二个参数:$2"
    echo "引用值:$@"
    echo "引用值$*"
    echo "参数个数:$#"

    运行结果

    5、变量值输出

    1、echo命令 

       Shell变量可以使用echo命令实现标准输出,在屏幕上打印出指定的字符串,之前的例子中已经详细用过了,这里不再赘述。

    2、printf命令

      printf命令用于格式化输出,可以看作echo的增强版。printf可以输出简单的字符串,但不会像echo那样自动换行。

    6、变量值读取

      通过键盘读入变量值,是Shell程序设计的基本交互手段之一。使用read命令可以将变量的值作为字符串从键盘读入,其基本用法如下:

    read 变量

      例如下面的语句表示从键盘读入字符串到str。

    read str

      在执行read命令时可以不指定变量参数,它会将接收到的数据放置在环境变量$REPLY中。

      read读入的变量可以有多个,第一个数据给第一个变量,第二个数据给第二个变量,如果输入数据个数过多,则最后所有的值都给第一个变量。下面的脚本示例读取两个数,并显示出来。

    #!/bin/bash
    read -p "请输入两个数字:" v1 v2
    echo $v1
    echo $v2

     运行结果

      还可以使用选项-n对输入的字符进行计数,当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量。

    7、变量替换

      变量替换可以根据变量的状态(是否为空,是否定义等)来改变它的值。使用花括号来限定一个变量的开始和结束。可以使用以下几种变量替换形式。

    ${var}:替换为变量本来的值。

    ${var:-word}:如果变量var为空或已被删除,则返回word,但不改变var的值。

    ${var:=word}:如果变量var为空或已被删除,则返回word,并改变var的值为word。

    ${var:?message};如果变量var为空或已被删除,则将消息message发送到标准错误输出,可以用来检测变量var是否可以被正常赋值。这种替换出现在Shell脚本中,脚本将停止运行。

    ${var:+word};如果变量var被定义,则返回word,但不改变var的值。

    下面为一个例子

    echo ${var:-"变量未设置"}
    var=123456
    echo "变量值为:${var}"

    运行结果为

     

    如果使用单引号来包括替换的变量,则变量替换将不起作用,仍然原样输出。例如:

    8、数组

      bash支持一维数组(不支持多维数组),并且没有限定数组的大小。与C语言类似,数组元素的下标由0开始编号,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.

      在Shell中用括号来表示数组,数组元素用空格分开。数组定义的用法如下:

    数组名=(值1...值n)
    

      例如

    array=(A B C D}
    

      也可以单独定义数组的各个元素,如:

    arry [0]=A
    arry [1]=B
    

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

    读取数组元素值的语法格式为:

    ${数组名[下标]}
    

      例如:

    echo ${arry[1]}

      使用@或*可以获取数组中的所有元素,例如

    echo ${arry[@]}
    echo ${arry[*]}

      采用以下用法可以获取数组元素的个数:

    echo {#数组名[@]}
    

      以下用法用于取得数组单个元素的长度:

    ${#数组名[n]}
    

      

  • 相关阅读:
    GPT分区安装windows10详细教程
    paddle07-paddle.regularizer正则化
    paddle02-paddle.io(数据读取相关) 【完】
    【python】80行代码实现压缩包密码破解软件,支持zip和rar
    【python】B站弹幕数据分析及可视化(爬虫+数据挖掘)
    【python】10行代码下载B站弹幕
    【pytorch】使用迁移学习(resnet18)训练mnist数据集
    迁移学习在实际应用中需要注意什么?
    【python】进度条的简单实现
    【机器学习】AI去马赛克工具(图像修复)
  • 原文地址:https://www.cnblogs.com/noticeable/p/8846952.html
Copyright © 2011-2022 走看看