文章目录

  • 变量的替换
    • 小知识加油站--trap
    • 使用trap设计一个用于反应程序执行过程的脚本

变量是什么,变量是脚本编程中进行数据表现的一种方法,说白了,变量不过是计算机为了保留数据项,而在内存中分配的一个位置或一组位置的标识或名字。

变量的替换

变量的名字就是保存变量值的地方,引用变量的值就叫做变量替换

$

shell中要仔细区分变量的名字和变量的值,如果a是一个变量,那么$a就是引用这个变量的值,即变量所包含的数据。

andrew@andrew-Thurley:/work/linux-sys/bash$a=1
andrew@andrew-Thurley:/work/linux-sys/bash$ echo a
a
andrew@andrew-Thurley:/work/linux-sys/bash$ echo $a
1

当变量裸体出现的时候,也就是说没有$前缀的时候,那么变量可能存在如下几种情况

  1. 变量被声明或被赋值
  2. 变量被unset
  3. 变量被exporte
  4. 或者处在一种特殊的情况下,变量代表一种信号

trap.sh

#!/bin/bash
# 使用trap来捕捉变量值.trap 'echo Variable Listing --- a = $a b = $b' EXIT
# EXIT是脚本中exit命令所产生信号的名字.
#
# "trap"所指定的命令并不会马上执行,
#+ 只有接收到合适的信号, 这些命令才会执行.
echo "This prints before the \"trap\" --"
echo "even though the script sees the \"trap\" first."
echo
a=39
b=36
exit 0
andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap.sh
This prints before the "trap" --
even though the script sees the "trap" first.Variable Listing --- a = 39 b = 36

被一双引号""括起来的变量替换是不会被阻止的,所以双引号被称为部分引用,有的时候又被称为弱引用。如果是使用单引号的话''那么比变量的替换就会被禁止,变量名只会被解释成字面的意思,不会出发变量的替换。所以单引号被称为全引用,有的时候被称为强引用

#!/bin/bash# 变量赋值和替换a=375
hello=$a#------------------------------------------------------------------
# 强烈注意, 在赋值的的时候, 等号前后一定不要有空格.
# 如果出现空格会怎么样?# "VARIABLE =value"
#
#% 脚本将尝试运行一个"VARIABLE"的命令, 带着一个"=value"参数.# "VARIABLE= value"
#
#% 脚本将尝试运行一个"value"的命令,
#+ 并且带着一个被赋值成""的环境变量"VARIABLE".
#------------------------------------------------------------------
echo hello
# 没有变量引用, 只是个hello字符串.
echo $hello
echo ${hello} # 同上.echo "$hello"
echo "${hello}"echohello="A B C D"
echo $hello
# A B C D
echo "$hello" # A B C D
# 就象你看到的echo $hello和echo "$hello"将给出不同的结果.
# ===============================================================
# 引用一个变量将保留其中的空白, 当然, 如果是变量替换就不会保留了.
# ===============================================================echoecho '$hello' # $hello
#
# 全引用的作用将会导致"$"被解释为单独的字符,
#+ 而不是变量前缀.# 注意这两种引用所产生的不同的效果.# 设置为空值.
hello=    echo "\$hello (null value) = $hello"
# 注意设置一个变量为null, 与unset这个变量, 并不是一回事
#+ 虽然最终的结果相同(具体见下边).# --------------------------------------------------------------# 可以在同一行上设置多个变量,
#+ 但是必须以空白进行分隔.
# 慎用, 这么做会降低可读性, 并且不可移植.var1=21 var2=22 var3=$V3
echo
echo "var1=$var1
var2=$var2
var3=$var3"# 在老版本的"sh"上可能会引起问题.# --------------------------------------------------------------echo; echonumbers="one two three"
#
other_numbers="1 2 3"
## 如果在变量中存在空白, If there is whitespace embedded within a variable,
#+ 那么就必须加上引用.
# other_numbers=1 2 3
# 给出一个错误消息.
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"
# other_numbers = 1 2 3
# 不过也可以采用将空白转义的方法.
mixed_bag=2\ ---\ Whatever
#在转义符后边的空格(\).echo "$mixed_bag"
# 2 --- Whateverecho; echoecho "uninitialized_variable = $uninitialized_variable"
# Uninitialized变量为null(就是没有值).
uninitialized_variable=
# 声明, 但是没有初始化这个变量,#+ 其实和前边设置为空值的作用是一样的.
echo "uninitialized_variable = $uninitialized_variable"# 还是一个空值.uninitialized_variable=23
# 赋值.
unset uninitialized_variable
# Unset这个变量.
echo "uninitialized_variable = $uninitialized_variable"# 还是一个空值.
echoexit 0

像C语言中的变量一样,一个未初始化的变量将会是null值 - 就是未赋值(但并不代表值是0),在给变量 赋值之前就使用这个变量通常会引起问题。

小知识加油站–trap

trap的格式如下,功能就是捕捉信号,并对信号进行处理

trap [-lp] [[arg] sigspec ...]

trap使用官方简介

  trapAutomatically execute commands after receiving signals by processes or the operating system.Can be used to perform cleanups for interruptions by the user or other actions.- List available signals to set traps for:trap -l- List active traps for the current shell:trap -p- Set a trap to execute commands when one or more signals are detected:trap 'echo "Caught signal SIGHUP"' SIGHUP- Remove active traps:trap - SIGHUP SIGINT
  • arg可以是shell命令或者自定义函数
  • sigspec可以是以下的一个或多个
  • 定义在<signal.h>中的信号名或者数值。信号名的大小写不敏感,SIG这个前缀也是可选的。以下的命令的效果都是一样的
trap "echo SIGINT" SIGINT
trap "echo SIGINT" sigint
trap "echo SIGINT" 2
trap "echo SIGINT" int
trap "echo SIGINT" Int

调试脚本时,trap经常用到的信号量

  • EXIT:在shell退出前执行trap设置的命令,也可以指定为0
  • RETURN:在.和``source执行其他脚本返回时,执行trap`设置的命令
  • DEBUG:在任何命令执行前执行trap设置的命令,但对于函数仅在函数的第一条命令前执行一次
  • ERR:在命令结果为非0时,执行trap设置的命令
#! /bin/bash
# 使用trap实现在每个函数开始之前打印以便打印,这样就能准确的定位到函数的位置
# 从而实现对脚本的调试
trap "echo before a func is called" DEBUG
# 当. 或者 source 调用结束的时候出发
trap "echo . or source is called "  RETURN
func()
{echo "不管你信不信,这是一个函数"exit 0
}
# 测试
echo "call ."
. traptest# 函数的调用
func
# DEBUG 查看调试信号是否有效的设置了
# trap -p RETURN
# trap -p DEBUGexit 0

执行结果

andrew@andrew-Thurley:/work/linux-sys/bash/2.基本/src$ bash trap_func.sh
before a func iis called
before a func iis called
call .
before a func iis called
. or source is called
before a func iis called
不管你信不信,这是一个函数
  • trap -l:列出所有信号的数值和名字,类似于kill -l
andrew@andrew-Thurley:~$ trap -l1) SIGHUP  2) SIGINT    3) SIGQUIT   4) SIGILL    5) SIGTRAP6) SIGABRT  7) SIGBUS    8) SIGFPE    9) SIGKILL  10) SIGUSR1
11) SIGSEGV  12) SIGUSR2  13) SIGPIPE  14) SIGALRM  15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD  18) SIGCONT  19) SIGSTOP  20) SIGTSTP
21) SIGTTIN  22) SIGTTOU  23) SIGURG   24) SIGXCPU  25) SIGXFSZ
26) SIGVTALRM    27) SIGPROF  28) SIGWINCH 29) SIGIO    30) SIGPWR
31) SIGSYS   34) SIGRTMIN 35) SIGRTMIN+1   36) SIGRTMIN+2   37) SIGRTMIN+3
38) SIGRTMIN+4   39) SIGRTMIN+5   40) SIGRTMIN+6   41) SIGRTMIN+7   42) SIGRTMIN+8
43) SIGRTMIN+9   44) SIGRTMIN+10  45) SIGRTMIN+11  46) SIGRTMIN+12  47) SIGRTMIN+13
48) SIGRTMIN+14  49) SIGRTMIN+15  50) SIGRTMAX-14  51) SIGRTMAX-13  52) SIGRTMAX-12
53) SIGRTMAX-11  54) SIGRTMAX-10  55) SIGRTMAX-9   56) SIGRTMAX-8   57) SIGRTMAX-7
58) SIGRTMAX-6   59) SIGRTMAX-5   60) SIGRTMAX-4   61) SIGRTMAX-3   62) SIGRTMAX-2
63) SIGRTMAX-1   64) SIGRTMAX
  • trap -p:列出通过trap设置过的信号处理命令
andrew@andrew-Thurley:~$ trap -p
trap -- 'name ' SIGINT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
trap -- 'name ' RETURN
trap "" sigspec :忽略sigspec指定的信号
trap "do something" sigspec:收到sigspec指定的信号时,do some thing后,继续执行后续命令。
trap sigspec or trap - sigspec:恢复sigspec指定的信号的默认行为

注意

  • 在函数中设置的trap也是全局生效的
#!/bin/bash
# trap设置在函数中的tap也是全局有效的
foo()
{    trap "echo func is called" DEBUG
}# 输出 func is called
foo
# 调试触发
#trap -p DEBUG
# 输出trap -- 'echo func is called' SIGINT
exit 0
  • 对于同一个信号,只有最后一次trap生效
  • trap只在本进程内有效,它的子进程不会继承trap的设置。

使用trap设计一个用于反应程序执行过程的脚本

#!/bin/bash
# 使用trap来捕捉变量值.# EXIT代表在函数退出前,执行trap
trap 'echo Variable Listing --- ret=${ret}' EXITps -A
if [ $? == 0 ];thenecho "commond exec OK!"ret=0
elseret=1
fiecho "注意这里,还没有调用trap"# trap是在退出的时候清理程序时调用的
exit 0

shell--变量的替换相关推荐

  1. awk中引用shell变量执行替换的脚本

    遇到问题: 现在有两个脚本,我想 将file1中的内容按file2来匹配 [root@154 home]# cat file1 3-1-1 POTV=1,POTA=0,POTP=2 1-4-76 PO ...

  2. shell中变量的替换

    shell中变量的替换 Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换 条件放在{}中. 1.${value:-word} 当变量未定义或者值为空时,返回值为word ...

  3. shell变量里的字符替换

    shell变量里的字符替换 b=${a/123/321};将${a}里的第一个123替换为321 b=${a//123/321};将${a}里的所有123替换为321 shell调试: sh -x a ...

  4. linux中对shell变量内容的修改和替换

    鸟哥私房菜中,对这一内容的描述,简直让人看不懂,好不容易找来文章可以帮助理解下. linux中对shell变量内容的修改和替换 1.变量内容修改 file=/dir1/dir2/dir3/my.fil ...

  5. linux超级基础系列——shell变量(本地变量和环境变量)

    linux超级基础系列--shell变量(本地变量和环境变量) 2006-12-04 00:39 为使shell编程更有效,系统提供了一些shell变量.shell变量可以保存诸如路径名.文件名或者一 ...

  6. shell变量加单引号sql_关于shell:在Bash中的命令中扩展变量的单引号

    我想从bash shell脚本中运行一个命令,该脚本在单引号和变量中包含单引号和一些其他命令. 如repo forall -c '....$variable'. 在这种格式中,对$进行转义,不展开变量 ...

  7. 马哥学习笔记——shell变量类型

    shell变量基础 shell 变量是一种很"弱"的变量,默认情况下,一个变量保存一个串,shell不关心这个串是什么含义.所以若要进行数学运算,必须使用一些命令例如let. de ...

  8. Makefile中的变量和shell变量

    我们在写makefile时 多多少少会用到shell脚本, 对于变量的在shell中的使用有一些要注意的细节.让我们从一个简单的makefile来看看. 注意makefile中一定要有一个目标,且一定 ...

  9. php引用shell变量,Linux Shell Bash变量的间接引用 - Powered by PHPWind....

    假设一个变量的值是第二个变量的名字. 那么我们如何从第一个变量中取得第二个变量的值呢? 比如, 如果a=letter_of_alphabet并且letter_of_alphabet=z, 那么我们能够 ...

  10. Linux 的 Shell 变量

    [简述] 变量即计算机中用于记录一个值的符号,而这些符号可用于不同的运算处理中. 通常变量与值是一对一的关系,可以通过表达式读取它的值并赋值给其它变量,也可以直接指定数值赋值给任意变量. 为便于运算和 ...

最新文章

  1. 模型压缩95%:Lite Transformer,MIT韩松等人
  2. MVC系列框架之Struts存在的意义是什么?
  3. this super 在接口以及实现类中所指的对象
  4. iptables防火墙(二)
  5. 获取Class对象的三种方式
  6. DotLiquid模板引擎简介
  7. MySQL的乱码解决方案
  8. eclipse svn插件安装_PHP 安装
  9. 拓端tecdat|R语言JAGS贝叶斯回归模型分析博士生延期毕业完成论文时间
  10. iweboffice 保存成html,金格iweboffice2015使用
  11. 各种计算机绘图的应用场合,cad制图员面试技巧
  12. 我私藏的那些实用的终端命令行工具
  13. Elasticsearch7.x搜索实战
  14. Elasticsearch 7.10 之 Data tiers
  15. oracle database各个版本地址
  16. 有哪些日记app可以用来记录生活?
  17. 多设备同步课程表,适用于iOS与Android
  18. 微领地商业模式开发 软件开发
  19. 【python3】leetcode 888. Fair Candy Swap(easy)
  20. Centos 7 源码编译安装 mysql

热门文章

  1. NYOJ 618 追击
  2. NYOJ 716 River Crossing(动态规划)
  3. 【ACM】最长公共子序列 - 动态规划
  4. python 解析 配置文件
  5. 关于全角半角转换(转)
  6. The Art of Unix Programming
  7. NYOJ 257 中缀表达式表示成后缀表达式
  8. 用代码创建工程并添加内容
  9. TensorFlow版本
  10. Golang 入门笔记(二)下