29 June 2013

特殊环境变量

$#               命令行参数的个数
$*               所有命令行参数的内容(值为字符串)
$@               所有命令行参数的内容(值为字符串数组)
$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}

这部分内容参见这里的说明。