特殊环境变量
$# 命令行参数的个数
$* 所有命令行参数的内容(值为字符串)
$@ 所有命令行参数的内容(值为字符串数组)
$0 命令程序的文件名或命令的名字
$n 命令行的第n个参数
$? 上一条命令执行后的状态
$$ 当前shell的PID
$! 最后一个后台运行的命令的PID
$- 当前选项标志
$ 上一条命令的最后一个参数
usage
变量名
在使用shell中的变量时,要注意变量名是否正确,尤其是像一些连字符的使用,若使用不当,则会产生意想不到的效果。例如:
#!/bin/sh
a="a"
b="b"
echo $a-$b
echo $a_$b
输出为:
a-b
b
之所以会出现这种情况,是因为,shell将a_
看作是一个完整的变量名,而a_
本身并没有定义,所以打印出来就是空值。 要解决这个问题,可以使用{}将变量名括起来,例如
#!/bin/sh
a="a"
b="b"
echo ${a}-${b}
echo ${a}_${b}
这时,输出的结果就是
a-b
a_b
参数扩展
这部分内容很多,这里只介绍其中一些,详细内容,参见man手册。
${parameter:-word}
${parameter:-word} Use Default Values. If parameter is unset or null, the expansion of word is substituted.Otherwise, the value of parameter is substituted.
使用示例(编译openjdk时声称的test_gamma脚本):
#!/bin/sh
# Generated by /Users/caoxudong/workspace/repositories/openjdk/macosx-port/hotspot/make/bsd/makefiles/buildtree.make
. ./env.sh
if [ "" != "" ]; then { echo Cross compiling for ARCH , skipping gamma run.; exit 0; }; fi
if [ -z $JAVA_HOME ]; then { echo JAVA_HOME must be set to run this test.; exit 0; }; fi
if ! ${JAVA_HOME}/bin/java -d32 -fullversion 2>&1 > /dev/null
then
echo JAVA_HOME must point to 32bit JDK.; exit 0;
fi
rm -f Queens.class
${JAVA_HOME}/bin/javac -d . /Users/caoxudong/workspace/repositories/openjdk/macosx-port/hotspot/make/test/Queens.java
[ -f gamma_g ] && { gamma=gamma_g; }
./${gamma:-gamma} -Xbatch -showversion Queens < /dev/null
其中,最后一行的./${gamma:-gamma}
的含义是,如果变量gamma
为null或未设置,就使用字符串gamma
代替。
${parameter:offset:length}
这部分内容参见这里的说明。