• shell中的特殊变量



    1.位置参数

    运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

    调用函数时也可以传递参数,但Shell 函数参数的传递和其它编程语言不同,没有所谓的形参和实参,在定义函数时也不用指明参数的名字和数目。换句话说,定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

    这种通过$n的形式来接收的参数,在 Shell 中称为位置参数如果参数个数太多,达到或者超过了 10 个,那么就得用${n}的形式来接收了,例如 ${10}、${23}。{ }的作用是为了帮助解释器识别参数的边界,这跟使用变量时加{ }是一样的效果。

    在讲解变量的命名时,我们提到:变量的名字必须以字母或者下划线开头,不能以数字开头;但是位置参数却偏偏是数字,这和变量的命名规则是相悖的,所以我们将它们视为“特殊变量”。除了 $n,Shell 中还有 $#、$*、$@、$?、$$ 几个特殊参数。

     脚本结果解释
    给脚本文件传递位置参数

     test.sh

    1. #!/bin/bash
    2. echo "Language: $1"
    3. echo "URL: $2"

    运行

    . ./test.sh Shell http://www.baidu.com/

    结果

    Language: Shell URL: http://www.baidu.com/

    Shell是第一个位置参数,http://www.baidu.com/是第二个位置参数,两者之间以空格分隔

     给函数传递位置参数

    test.sh

    1. #!/bin/bash
    2. #定义函数
    3. function func(){
    4. echo "Language: $1"
    5. echo "URL: $2"
    6. }
    7. #调用函数
    8. func C++ http://www.baidu.com//
    运行
    . ./test.sh
    结果
    Language: C++
    URL: http://www.baidu.com/
     

    2.特殊变量

    变量含义
    $0 当前脚本的文件名
    $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
    $# 传递给脚本或函数的参数个数
    $* 传递给脚本或函数的所有参数
    $@ 传递给脚本或函数的所有参数。当被双引号" "包含时,$@ 与 $* 稍有不同,后续会介绍。
    $? 上个命令的退出状态,或函数的返回值,后续会介绍。
    $$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

    2.1 用法举栗

     脚本结果
    给脚本文件传递参数

    test.sh

    1. #!/bin/bash
    2. echo '------------test special variable in file---------'
    3. echo "file name:${0}"
    4. echo "first para:${1}"
    5. echo "second para:${2}"
    6. echo "all paras:$*"
    7. echo "paras Num:$#"
    8. echo "current PID:$$"
    9. echo "PPID:$PPID"

    执行bash test.sh aa bb

    结果

    1. ------------test special variable in file---------
    2. file name:test.sh
    3. first para:aa
    4. second para:bb
    5. all paras:aa bb
    6. paras Num:2
    7. current PID:79494
    8. PPID:91647
    给函数传递参数

    test.sh

    1. #!/bin/bash
    2. echo '------------test special variable in function---------'
    3. function test_special_variable(){
    4. echo "file name:${0}"
    5. echo "first para:${1}"
    6. echo "second para:${2}"
    7. echo "all paras:$*"
    8. echo "paras Num:$#"
    9. echo "current PID:$$"
    10. echo "PPID:$PPID"
    11. }
    12. test_special_variable aa bb

    执行bash test.sh

    结果

    1. ------------test special variable in function---------
    2. file name:test.sh
    3. first para:cc
    4. second para:dd
    5. all paras:cc dd
    6. paras Num:2
    7. current PID:79494
    8. PPID:91647

    2.2 $* 和 $@ 的区别

    $* 和 $@ 都表示传递给函数或脚本的所有参数,当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。但是当它们被双引号" "包含时,就会有区别了:

    • "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
    • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。


    比如传递了 2个参数,那么对于"$*"来说,这 2 个参数会合并到一起形成一份数据,它们之间是无法分割的;而对于"$@"来说,这 2个参数是相互独立的,它们是 2 份数据。
    如果使用 echo 直接输出"$*""$@"做对比,是看不出区别的;但如果使用 for 循环来逐个输出数据,立即就能看出区别来。

    脚本结果知识点

    test.sh

    1. #!/bin/bash
    2. echo 'print each para from "$*"'
    3. for var in "$*"
    4. do
    5. echo "$var"
    6. done
    7. echo ""

    执行bash test.sh aa bb

    print each para from "$*"

    aa bb

    从运行结果可以发现,对于"$*",只循环了 1 次,因为它只有 1 分数据;对于"$@",循环了 2次,因为它有 2份数据。

    或者说"$*"将所有的参数从整体上看做一份数据,$*、$@、"$@"将每个参数都看作一份数据,彼此之间是独立的

    test.sh

    1. #!/bin/bash
    2. echo 'print each para from  $*'
    3. for var1 in $*
    4. do
    5. echo "$var1"
    6. done
    7. echo ""

    print each para from  $*

    aa

    bb

     

    test.sh

    1. #!/bin/bash
    2. echo 'print each para from "$@"'
    3. for var2 in "$@"
    4. do
    5. echo $var2
    6. done
    7. echo ""

    print each para from "$@"

    aa

    bb

     

     

    test.sh

    1. #!/bin/bash
    2. echo 'print each para from $@'
    3. for var3 in $@
    4. do
    5. echo $var3
    6. done
    7. echo ""

    print each para from $@

    aa

    bb

    2.3 $?的用法

    $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值所谓退出状态,就是上一个命令执行后的返回结果

    退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

     脚本结果

    $? 获取上一个命令的退出状态

     test.sh

    1. #!/bin/bash
    2. if "$1" == 100 ]
    3. then
    4. exit #参数正确,退出状态为0
    5. else
    6. exit #参数错误,退出状态1
    7. fi

    exit表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法取得它的退出状态。

    运行脚本:bash ./test.sh 100 #使用bash作为一个新进程运行

    获取退出状态:echo $?----->0

    运行脚本:bash ./test.sh 89

    获取退出状态:echo $?----->1

    $? 获取函数的返回值

    test.sh

    1. #!/bin/bash
    2. #得到两个数相加的和
    3. function add(){
    4. return `expr $1 $2`
    5. }
    6. add 23 50 #调用函数
    7. echo $? #获取函数返回值
    运行结果:
    73

    请注意:严格来说,Shell 函数中的 return 关键字用来表示函数的退出状态,而不是函数的返回值Shell 不像其它编程语言,没有专门处理返回值的关键字。



  • 相关阅读:
    bin/sh^M: bad interpreter: No such file or directory解决
    1.2前置条件
    LINUXIPCS信息
    动态添加样式表规则第3版
    Google放出C++代码风格规范
    我的模块加载系统 v4
    有关婚姻的名言
    javascript 测试工具abut v3
    全世界最短的domReady
    javascript 模板系统 ejs v7
  • 原文地址:https://www.cnblogs.com/ting152/p/12519436.html
Copyright © 2020-2023  润新知