bash-高级编程--变量和参数介绍
文章目录
- 变量的替换
- 使用trap设计一个用于反应程序执行过程的脚本
- 变量的赋值
- `bash`变量是不区分类型的
- 特殊变量类型
变量是什么,变量是脚本编程中进行数据表现的一种方法,说白了,变量不过是计算机为了保留数据项,而在内存中分配的一个位置或一组位置的标识或名字。
变量的替换
变量的名字就是保存变量值的地方,引用变量的值就叫做变量替换
$
在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当变量裸体出现的时候,也就是说没有$前缀的时候,那么变量可能存在如下几种情况
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经常用到的信号量
- EXIT:在shell退出前执行trap设置的命令,也可以指定为0
- RETURN:在.和``source执行其他脚本返回时,执行trap`设置的命令
- DEBUG:在任何命令执行前执行trap设置的命令,但对于函数仅在函数的第一条命令前执行一次
- ERR:在命令结果为非0时,执行trap设置的命令
执行结果
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
- trap -p:列出通过trap设置过的信号处理命令
注意
- 在函数中设置的trap也是全局生效的
- 对于同一个信号,只有最后一次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变量的赋值
=
赋值操作(前后都不能有空白)
注意:因为=和-eq都可以用作条件测试操作,所以不要与这里的赋值操作相混淆。
=既可以用作条件测试操作,也可以用于赋值操作,这需要视具体上下文而定
简单的变量赋值
#!/bin/bash # "裸体"变量 echo # 变量什么时候是"裸体"的, 比如前边少了$的时候? # 当它被赋值的时候, 而不是被引用的时候. # 赋值 a=879 echo "The value of \"a\" is $a." # 使用'let'赋值 let a=16+5 echo "The value of \"a\" is now $a." echo # 在'for'循环中(事实上, 这是一种伪赋值): echo -n "Values of \"a\" in the loop are: " for a in 7 8 9 11 doecho -n "$a " done echo echo # 使用'read'命令进行赋值(这也是一种赋值的类型): echo -n "Enter \"a\" " read a echo "The value of \"a\" is now $a." echoexit 0简单又不简单的的两种类型的变量赋值
#!/bin/bash a=23 # 简单的赋值 echo $a b=$a echo $b # 现在让我们来点小变化(命令替换). a=`echo Hello!` # 把'echo'命令的结果传给变量'a' echo $a # 注意, 如果在一个#+的命令替换结构中包含一个(!)的话, #+ 那么在命令行下将无法工作. #+ 因为这触发了Bash的"历史机制." # 但是, 在脚本中使用的话, 历史功能是被禁用的, 所以就能够正常的运行. a=`ls -l` echo $a echo echo "$a" exit 0使用$(...)机制来进行变量赋值(这是一种比后置引用(反引号`)更新的一种方法). 事实上这两种
方法都是命令替换的一种形式.
bash变量是不区分类型的
不像其他程序语言一样,bash并不区分变量的类型,本质上bash变量都是字符串。实际的作用依赖于上下文,Bash也允许比较操作和整数操作,其中的关键因素就是,变量中的值是否只有数值。
#!/bin/bash # int-or-string.sh: 整型还是字符串?a=2334 #整型. let "a += 1" echo "a = $a " # a = 2335 echo # 还是整型. b=${a/23/BB} # 将"23"替换成"BB". # 这将把变量b从整型变为字符串. echo "b = $b" # b = BB35 declare -i b # 即使使用declare命令也不会对此有任何帮助. echo "b = $b" # b = BB35 let "b += 1" # BB35 + 1 = echo "b = $b" # b = 1 echo c=BB34 echo "c = $c" # c = BB34 d=${c/BB/23} # 将"BB"替换成"23". # 这使得变量$d变为一个整形. echo "d = $d" # d = 2334 let "d += 1" # 2334 + 1 = echo "d = $d" # d = 2335 echo# null变量会如何呢? e="" echo "e = $e" # e = let "e += 1" # 算术操作允许一个null变量? echo "e = $e" # e = 1 echo # null变量将被转换成一个整型变量.# 如果没有声明变量会怎样? echo "f = $f" # f = let "f += 1" # 算术操作能通过么? echo "f = $f" # f = 1 echo # 未声明的变量将转换成一个整型变量. # 所以说Bash中的变量都是不区分类型的. exit 0不区分变量的类型既是幸运的事情也是悲惨的事情. 它允许你在编写脚本的时候更加的灵活(但是也足
够把你搞晕!), 并且可以让你能够更容易的编写代码. 然而, 这也很容易产生错误, 并且让你养成糟糕
的编程习惯.
这样的话, 程序员就承担了区分脚本中变量类型的责任. Bash是不会为你区分变量类型的
特殊变量类型
局部变量
这种变量只有代码块或者函数中才可见
如果变量用local 来声明, 那么它就只能够在该变量被声明的代码块中可见. 这个代码块就是局
部"范围". 在一个函数中, 一个局部变量只有在函数代码块中才有意义.
环境变量
这种变量将影响用户接口和shell的行为
总结
以上是生活随笔为你收集整理的bash-高级编程--变量和参数介绍的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 作者:崔辰州(1976-),男,博士,中
- 下一篇: bash-高级编程--位置变量