首先明声,我是一个菜鸟。一下文章中现出技术误导情况盖不负责
变量和数参的分析
变量替换
变量的名字就是变量存保值的地方. 用引变量的值就叫做变量替换.“$“这个符号就好像是一种志标
让我们细仔的别区变量的名字和变量的值. 如果variable是一个变量的名字, 那么$variable就是用引这变量的值, 即这边变量所含包的数据.
root@ubuntu:~# variable=12 root@ubuntu:~# echo variable variable root@ubuntu:~# echo $variable 12
当变量没有$前缀的时候,那么变量可能存在如下几种情况.
1.变量被明声或被赋值,
2.变量被unset,
3.变量被exporte,
4.变量处在一种殊特的情况,变量代表一种信号
变量赋值可以应用=(比如 var1=27), 也可以在read命令中或者循环头停止赋值 (for var2 in 1 2 3).
被一对双引号(" ")括起来的变量替换是不会被止阻的. 所以双引号被称为部份用引, 有时候又被称为"弱用引". 但是如果应用单引号的话(' '), 那么变量替换就会被制止了, 变量名只会被释解成字面的意思, 不会生发变量替换. 所以单引号被称为全用引, 有时候也被称为"强用引".
意注$variable事实上只是${variable}的简写式形. 在某些上下文中$variable可能会引发错误, 这时候你就要需用${variable}了
上面以一个例子做说明
#!/bin/bash # 变量赋值和替换 a=375 #这里没有$说明是明声并且赋值了 hello=$a #$a表现应用变量a的值,把这个值赋值给hello这个变量 #------------------------------------------------------------------------- # 烈强意注, 在赋值的的时候, 等号前后定一不要有空格. # 如果现出空格会怎么样? # "VARIABLE =value" # 脚本将试尝运行一个"VARIABLE"的命令, 带着一个"=value"数参. # "VARIABLE= value" # 脚本将试尝运行一个"value"的命令, 并且带着一个被赋值成""的环境变量"VARIABLE". #------------------------------------------------------------------------- echo hello #没有$这里打印hello变量的名字 echo $hello #打印hello变量的值 echo ${hello} #同样是打印hello变量的值 echo "$hello" echo "${hello}" hello="A B C D" #新重赋值 echo $hello # A B C D 用引一个变量将存保其中的白空, 当然, 如果是变量替换就不会存保了. echo "$hello" # A B C D echo '$hello' hello= echo "\$hello (null value) = $hello" V3=23 var1=21 var2=22 var3=$V3 echo "var1=$var1 var2=$var2 var3=$var3" numbers="one two three" other_numbers="1 2 3" echo "numbers = $numbers" echo "other_numbers = $other_numbers" mixed_bag=2\ ---\ Whatever echo "$mixed_bag" echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable= echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable=23 unset uninitialized_variable echo "uninitialized_variable = $uninitialized_variable" exit 0
看看这个脚本的行执结果:
root@ubuntu:~/resource/study/shell_study# ./value-test hello 375 375 375 375 A B C D A B C D $hello $hello (null value) = var1=21 var2=22 var3=23 numbers = one two three other_numbers = 1 2 3 2 --- Whatever uninitialized_variable = uninitialized_variable = uninitialized_variable =
一个未初始化的变量将会是"null"值 - 就是未赋值(但并非代表值是0!). 在给变量赋值之前就应用这个变量常通都市引发题问.
但是在行执算术作操的时候, 仍然有可能应用未初始化过的变量
root@ubuntu:~/resource/study/shell_study# echo "$data" root@ubuntu:~/resource/study/shell_study# let "data +=5" root@ubuntu:~/resource/study/shell_study# echo "$data" 5
论断:一个未初始化的变量是没有值的, 但是在做算术作操的时候, 这个未初始化的变量看起来值为0. 这是一个未档文化(并且可能不具可移植性)的行为.
赋值作操(前后都不能有白空)
因为=和-eq都可以用做条件测试作操, 所以不要与这里的赋值作操相淆混.
意注: =既可以用做条件测试作操, 也可以用于赋值作操, 这要需视体具的上下文而定.
单简的赋值作操举例:
#!/bin/bash # 赋值 a=879 echo "The value of \"a\" is $a." # 应用'let'赋值 let a=16+5 echo "The value of \"a\" is now $a." # 在'for'循环中(事实上, 这是一种伪赋值): echo -n "Values of \"a\" in the loop are: " #这里加上-n表现略忽string最后的换行作操,否则会换行 for a in 7 8 9 11 do echo -n "$a " done echo # 应用'read'命令停止赋值(这也是一种赋值的类型): echo -n "Enter \"a\": " read a #读取输入的值 echo "The value of \"a\" is now $a." exit 0
验实结果:
root@ubuntu:~/resource/study/shell_study# ./value-test1 The value of "a" is 879. The value of "a" is now 21. Values of "a" in the loop are: 7 8 9 11 Enter "a": 121212 The value of "a" is now 121212.
再看一个微稍杂复一点的例子:
#!/bin/bash a=23 # 单简的赋值 echo $a b=$a echo $b # 当初让我们来点小变更(命令替换). a=`echo Hello!` # 把'echo'命令的结果传给变量'a' echo $a a=`ls -l` # 把'ls -l'的结果赋值给'a' echo $a # 然而, 如果没有引号的话将会删除ls结果中过剩的tab和换行符. echo echo "$a" # 如果加上引号的话, 那么就会存保ls结果中的白空符. exit 0
看一看验实结果:
root@ubuntu:~/resource/study/shell_study# chmod 777 value-test2 root@ubuntu:~/resource/study/shell_study# ./value-test2 23 23 Hello! total 48 -rwxrwxrwx 1 root root 663 2013-04-22 03:34 clear_log -rw-r--r-- 1 root root 354 2013-04-22 03:15 data-file -rwxrwxrwx 1 root root 404 2013-04-22 05:05 for_test -rwxrwxrwx 1 root root 345 2013-04-22 03:16 include_file -rwxrwxrwx 1 root root 831 2013-04-22 04:08 para_sub -rwxrwxrwx 1 root root 253 2013-04-22 00:35 show_self -rwxrwxrwx 1 root root 256 2013-04-22 04:41 test1 -rwxrwxrwx 1 root root 204 2013-04-22 04:50 test2 -rw-r--r-- 1 root root 59 2013-04-22 04:50 test-context -rwxrwxrwx 1 root root 1221 2013-04-23 22:33 value-test -rwxrwxrwx 1 root root 415 2013-04-23 22:51 value-test1 -rwxrwxrwx 1 root root 439 2013-04-23 22:57 value-test2 total 48 -rwxrwxrwx 1 root root 663 2013-04-22 03:34 clear_log -rw-r--r-- 1 root root 354 2013-04-22 03:15 data-file -rwxrwxrwx 1 root root 404 2013-04-22 05:05 for_test -rwxrwxrwx 1 root root 345 2013-04-22 03:16 include_file -rwxrwxrwx 1 root root 831 2013-04-22 04:08 para_sub -rwxrwxrwx 1 root root 253 2013-04-22 00:35 show_self -rwxrwxrwx 1 root root 256 2013-04-22 04:41 test1 -rwxrwxrwx 1 root root 204 2013-04-22 04:50 test2 -rw-r--r-- 1 root root 59 2013-04-22 04:50 test-context -rwxrwxrwx 1 root root 1221 2013-04-23 22:33 value-test -rwxrwxrwx 1 root root 415 2013-04-23 22:51 value-test1 -rwxrwxrwx 1 root root 439 2013-04-23 22:57 value-test2
Bash变量是不辨别类型的
不像其他程序语言一样, Bash并不对变量辨别"类型". 本质上, Bash变量都是字符串. 但是依赖于体具的上下文, Bash也答应比拟作操和数整作操. 其中的关键因素就是, 变量中的值否是只有字数.
上面看一下一个实例;
#!/bin/bash a=2334 # 整型. let "a += 1" echo "a = $a " # a = 2335 b=${a/23/BB} # 将"23"替换成"BB". echo "b = $b" # b = BB35 declare -i b # 即使应用declare命令也不会对此有任何帮助. echo "b = $b" # b = BB35 let "b += 1" # BB35 + 1 = echo "b = $b" # b = 1 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 # null变量会如何呢? e="" echo "e = $e" # e = let "e += 1" # 算术作操答应一个null变量? echo "e = $e" # e = 1 # 如果没有明声变量会怎样? echo "f = $f" # f = let "f += 1" # 算术作操能通过么? echo "f = $f" # f = 1 # 所以说Bash中的变量都是不辨别类型的. exit 0
看一看他是行执结果:
root@ubuntu:~/resource/study/shell_study# ./int-char a = 2335 b = BB35 b = BB35 b = 1 c = BB34 d = 2334 d = 2335 e = e = 1 f = f = 1
不辨别变量的类型既是运幸的事件也是凄惨的事件. 它答应你在编写脚本的时候更加的灵巧(但是也充足把你弄晕!), 并且可以让你够能更易容的编写码代. 然而, 这也很易容生发错误, 并且让你养成糟的程编习气.
这样的话, 程序员就担承了辨别脚本中变量类型的义务. Bash是不会为你辨别变量类型的.
殊特的变量类型
局部变量
这类变量只有在码代块或者数函中(拜见数函中的局部变量)才可见.
环境变量
这类变量将影响用户接口和shell的行为
在常通情况下, 每一个进程都有自己的"环境", 这个环境是由一组变量成组的, 这些变量中存有进程可能要需用引的信息. 在这类情况下, shell与一个一般的进程没什么别区.
每次当一个shell启动时, 它都将建创适合于自己环境变量的shell变量. 更新或者添加一个新的环境变量的话, 这个shell都市立刻更新它自己的环境(译者注: 换句话说, 变动或增长的变量会当即失效), 并且有所的shell子进程(即这个shell所行执的命令)都市承继这个环境. (译者注: 确准地说, 应该是后继生成的子进程才会承继Shell的新环境变量, 已运行的子进程并不会到得它的新环境变量).
分配给环境变量的空间是限有的. 建创太多环境变量, 或者给一个环境变量分配太多的空间都市引发错误.
如果一个脚本要置设一个环境变量, 那么要需将这些变量"export"出来, 也就是要需通知到脚本地本的环境. 这是export命令的功能.
一个脚本只够能export变量到这个脚本所生发的子进程, 也就是说只够能对这个脚本所生发的命令和进程起作用. 如果脚本是从命令行中用调的, 那么这个脚本所export的变量是不能影响命令行环境的. 也就是说, 子进程是不够能export变量来影响生发自己的父进程的环境的.
置位数参
从命令行传递到脚本的数参: $0, $1, $2, $3 . . .
$0就是脚本文件自身的名字, $1 是第一个数参, $2是第二个数参, $3是第三个数参, 然后是第四个. $9后之的置位数参就必须用大括号括起来了, 比如, ${10}, ${11}, ${12}.
两个比拟殊特的变量$*和$@ 表现有所的置位数参.
还是看一个实例吧
#!/bin/bash # 作为用例, 用调这个脚本最少要需10个数参, 比如: # ./scriptname 1 2 3 4 5 6 7 8 9 10 MINPARAMS=10 echo "The name of this script is \"$0\"." echo "The name of this script is \"`basename $0`\"." if [ -n "$1" ] # 测试变量被用引. then echo "Parameter #1 is $1" # 要需用引才够能义转"#" fi if [ -n "$2" ] then echo "Parameter #2 is $2" fi if [ -n "$3" ] then echo "Parameter #3 is $3" fi if [ -n "${10}" ] # 大于$9的数参必须用{}括起来. then echo "Parameter #10 is ${10}" fi echo "-----------------------------------" echo "All the command-line parameters are: "$*"" if [ $# -lt "$MINPARAMS" ] then echo "This script needs at least $MINPARAMS command-line arguments!" fi exit 0
看看验实结果:
root@ubuntu:~/resource/study/shell_study# ./args 1 2 3 The name of this script is "./args". The name of this script is "args". Parameter #1 is 1 Parameter #2 is 2 Parameter #3 is 3 ----------------------------------- All the command-line parameters are: 1 2 3 This script needs at least 10 command-line arguments! root@ubuntu:~/resource/study/shell_study# ./args 1 2 3 4 5 6 7 8 9 10 11 The name of this script is "./args". The name of this script is "args". Parameter #1 is 1 Parameter #2 is 2 Parameter #3 is 3 Parameter #10 is 10 ----------------------------------- All the command-line parameters are: 1 2 3 4 5 6 7 8 9 10 11
{}标记法供提了一种提取从命令行传递到脚本的最后一个置位数参的单简方法
一些脚本可能会依赖于应用不同的用调名字, 来表现出不同的行为. 如果想要到达这类的目, 一般都要需在脚本中查检$0. 因为脚本只够能有一个真正的文件名, 如果要生发多个名字, 必须应用符号链接.
看一下shift命令的应用实例:
#!/bin/bash # 应用'shift'来逐渐存取有所的置位数参. 给脚本命个名, 比如shft,然后给脚本传递一些置位数参, 比如: ./shft a b c def 23 skidoo until [ -z "$1" ] # 直到有所的置位数参都被存取完... do echo -n "$1 " shift done echo exit 0
看查验实结果:
root@ubuntu:~/resource/study/shell_study# ./shift d df lsjf sldjf d df lsjf sldjf
待续。。。。
文章结束给大家分享下程序员的一些笑话语录: 祝大家在以后的日子里. 男生象Oracle般健壮; 女生象win7般漂亮; 桃花运象IE中毒般频繁; 钱包如Gmail容量般壮大, 升职速度赶上微软打补丁 , 追女朋友像木马一样猖獗, 生活像重装电脑后一样幸福, 写程序敲代码和聊天一样有**。