4.1 变量替换 $
1)如果variable1是变量名,${variable1}是这个变量的值,$variable1是简写形式
2)当变量被声明或被赋值,被unset,被export,或者代表一种信号时,变量前不用$
3)除了可以用=赋值,还可以在read或者循环头被赋值(for var2 in 1 2 3)
4)双引号允许变量替换,单引号阻止变量替换
5)用引号引用一个变量将保留其中的空白, 当然, 如果是变量替换就不会保留了。
hello="A B C D" echo $hello # A B C D echo "$hello" # A B C D
6)一个未初始化的变量是null值,但并不总表示值为0。但是在做算术操作的时候, 这个未初始化的变量看起来值为0。例如:
let "uninitialized += 5" echo "$uninitialized" # 5
4.2 变量赋值 =
1)赋值操作,等号前后不能有空白
2)如果对变量不使用引号引用,则echo时会去掉多余的tab和换行符,例如:
a=`ls -l` echo $a # 如果没有引号的话将会删除ls结果中多余的tab和换行符 echo "$a" #如果加上引号的话, 那么就会保留ls结果中的空白符
3)使用$(…)进行赋值,比反引号`更新的方法,都是命令替换的一种形式。
arch=$(uname -m)
4.3 Bash变量是不区分类型的
bash变量不区分类型,本质都是字符串。是否允许整数操作和比较操作,取决于变量中是否只有数字
4.4 特殊的变量类型
1)局部变量。只有在代码块或者函数中才可见的的局部变量 local
2)环境变量。
脚本设置环境变量,需要执行export才生效。
一个脚本只能够export变量到这个脚本所产生的子进程,如果脚本是从命令行中调用的, 这个脚本所export的变量是不能影响命令行环境的。子进程不能export变量来影响产生自己的父进程的环境。
3)位置参数。从命令行传递到脚本的参数。
$0就是脚本文件自身的名字,$1 是第一个参数。。。,$9之后的位置参数就必须用大括号括起来${10}。$*和$@ 表示所有的位置参数。
4)一种提取从命令行传递到脚本的最后一个位置参数的简单办法
args=$#
lastarg=${!args}
# 或: lastarg=${!#}
# 注意, 不能直接使用 lastarg=${!$#} , 这会产生错误.
5)如果命令行参数没有提供,最好的防止错误产生的方式是进行参数替换,设置默认值
${1:-$DefaultVal}
6)shift命令。
是把所有的位置参数都向左移动一个位置,$1 <--- $2, $2 <--- $3, $3 <--- $4。原来的$1就消失了, 但是$0 (脚本名)是不会改变的。
如果传递了大量的位置参数到脚本中,shift命令允许你访问的位置参数的数量超过10个,当然{}标记法也提供了这样的功能。
在函数参数的处理中也可以用shift,处理方式一样。
在bash 3.0.0.15版本,做了如下实验:
#!/bin/bash
#sh test.sh 1 2 3 4 5 6 7 8 9 10 11
echo $1 #1
echo $11 #11
echo ${11} #11
shift
echo $1 #2
echo $10 #20 ??what happened after shift
echo ${10} #11
反正无论如何,大于9的位置参数都使用{}总是没有错的
注意事项:
$0参数是由调用这个脚本的进程所设置的. 按照约定, 这个参数一般就是脚本的名字。
浙公网安备 33010602011771号