• Linux —— Shell编程之变量赋值和引用


    Linux的shell编程是一种非常成熟的编程语言,它支持各种类型的变量。有三种主要的变量类型:环境变量、内部变量和用户变量。

    • 环境变量(environment variable)是系统环境的一部分,不必去定义它们。可以在shell程序中使用它们,某些变量(比如PATH)还能在shell中加以修改。
    • 内部变量(built-in variable)是由系统提供的。与环境变量不同,你不能修改它们。
    • 用户变量(user variable)是你在编写shell脚本时定义的。可以在shell程序内任意使用它们和修改它们。

    shell编程和其他编程语言的主要不同之处是:在shell编程中,变量是非类型性质的。也就是说,不必指定变量是数字还是字符串。

    用户变量

    Shell编程中,使用用户变量无需事先声明,同时变量名的命名须遵循如下规则:

    1). 首个字符必须为字母(a-z,A-Z);
    2). 中间不能有空格,可以使用下划线(_) ;
    3). 不能使用标点符号 ;
    4). 不能使用bash里的关键字(可用help命令查看保留关键字) 。

    变量赋值

    变量赋值的格式:

    变量名=值

    访问变量值

    要取用一个变量的值,只需在变量名前面加一个$ 。

    ( ATTENTION: Don't keep blank between the variable with the equal operator '=' )

    举例

    #!/bin/bash
    # 对变量赋值:
    a="hello world"  #等号两边均不能有空格存在

    # 打印变量a的值:
    echo -e "A is: $a "

    备注:

    1). bash中变量赋值,等号两边均不能有空格存在;

    使用自己喜欢的编辑器,输入上述内容,并保存为文件test_hello.bsh,然后执行 chmod +x test_hello.bsh使其具有执行权限,最后输入 ./test_hello或bash test_hello.bsh执行该脚本。

    程序运行结果: 

    A is: hello world

    有时候变量名可能会和其它文字混淆,比如:

    num=1
    echo "this is the $numst"

    上述脚本并不会输出"this is the 1st"而是"this is the ";

    这是由于shell会去搜索变量numnd的值,而实际上这个变量并未赋值。

    我们可以用花括号来告诉shell把num变量跟其他部分分开:

    num=1
    echo "this is the ${num}st"

    程序运行结果:

    this is the 1st


    位置参数

    可以编写一个shell脚本,当从命令行或者从其他shell脚本中调用它的时候,这个脚本接受若干参数。这些选项是通过Linux作为位置参数 (position parameter)提供给shell程序的。位置参数有由系统给出的专用名。存放在变量中的第一个参数名为1(数字1),在程序内可以使用$1来访问; 存放在变量中的第二个参数名为2,在程序中可以使用$2来访问,依此类推。在调用shell程序时,可以省略一个或几个数字大的位置 参数。

    例如,如果shell程序mypgm1要求两个参数(比如名字和姓氏),那么可以只用一个参数(名字)来调用这个shell程序。但是,你不能只用第二个参数(姓氏)来调用shell程序。

    1.   
    1. #!/bin/bash  
    2. #name display program  
    3. if [ $# -eq 0 ]; then  
    4.     echo "Name not provided."  
    5. else  
    6.     echo "Your name is $1."  
    7. fi  

    在bash中,可以像下面 这样执行mypgm1:
    1. # . mypgm1  

    那么会得到下面的输出:
    Name not provided.
    但是,如果像下面这样执行mypgm1:
    1. # . mypgm1 david  
    那么会得到下面的输出:
    Your name is david.
    shell程序mypgm1还说明了shell编程的另一个方面,即内部变量。在mypgm1中,变量$#是一个内部变量,它提供传送给这个shell程序的位置参数的数量。

    内部变量

    内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

    部分内部变量总结如下:

    表 1.1. 常用内部变量

    $0 相当于C语言main函数的argv[0]
    $1$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]argv[2]...
    $# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
    $@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
    $? 上一条命令的Exit Status
    $$ 当前Shell的进程号

    为了说明这些变量的用法,这里有一个叫做mypgm2的示范程序:

    1. #!/bin/bash  
    2. #my test program  
    3. echo "Number of parameter is $#"  
    4. echo "Program name is $0"  
    5. echo "Parameters as a single string is $*"  


    在bash中,如果从命令行上执行mypgm2,如下所示:

    1. # . mypgm2 David Victor  


    那么会得到下面的结果:

      1. Number of parameters is 2  
      2. Program name is mypgm2  
      3. Parameters as a single string is David Victor 
  • 相关阅读:
    浅谈Lyndon分解
    【CF914G】Sum the Fibonacci(FWT)
    【洛谷6914】[ICPC2015 WF] Tours(非树边随机边权,树边边权异或)
    【洛谷7143】[THUPC2021 初赛] 线段树(动态规划)
    【洛谷7325】[WC2021] 斐波那契(数论)
    【CF666E】Forensic Examination(广义后缀自动机+线段树合并)
    【CF685C】Optimal Point(二分答案)
    【洛谷7364】有标号二分图计数(多项式开根)
    【CF679E】Bear and Bad Powers of 42(ODT+线段树)
    【洛谷5307】[COCI2019] Mobitel(动态规划)
  • 原文地址:https://www.cnblogs.com/try-better-tomorrow/p/5030627.html
Copyright © 2020-2023  润新知