zoukankan      html  css  js  c++  java
  • 4shell中的特殊变量

    • 1.位置参数
    • 2.特殊变量
      • 2.1 用法举栗
      • 2.2 $* 和 $@ 的区别
      • 2.3 $?的用法

    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

    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

    从运行结果可以发现,对于"$*",只循环了 1 次,因为它只有 1 分数据;对于"$@",循环了 2次,因为它有 2份数据。或者说"$*"将所有的参数从整体上看做一份数据,$*、$@、"$@"将每个参数都看作一份数据,彼此之间是独立的

    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 不像其它编程语言,没有专门处理返回值的关键字。

  • 相关阅读:
    强化学习的基本迭代方法
    基于文本描述的事务聚类
    学习强化学习之前需要掌握的3种技能
    其它 华硕 ASAU S4100U 系统安装 win10安装 重装系统 Invalid Partition Table 解决
    数据分析 一些基本的知识
    Python 取样式的内容 合并多个文件的样式 自定义样式
    电商 Python 生成补单公司需要的评论格式3
    SpringBlade 本地图片上传 生成缩略图
    SQL Server 字符串截取
    SpringBlade 本地图片上传
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12069480.html
Copyright © 2011-2022 走看看