变量指定 cd 命令可以搜索的路径,路径之间用冒号进行分隔。该变量的功能类似于指定可执行文件搜索路径的变量 $PATH。可以在本地文件 ~/.bashrc 中设置该变量。
bash$ cd bash-doc
bash: cd : bash-doc: No such file or directory
bash$ CDPATH=/usr/share/doc
bash$ cd bash-doc
/usr/share/doc/bash-doc
bash$ echo $PWD
/usr/share/doc/bash-doc
# 只能在 Bash 2.05b 及之后的版本中成功执行。
TMOUT=3 # 提示会在 3 秒后超时。
echo "What is your favorite song?"
echo "Quickly now, you only have $TMOUT seconds to answer!"
read song
if [ -z "$song" ]
then
song="(no answer)"
# 默认值。
fi
echo "Your favorite song is $song."
该 ID 表示的是当前用户的真实 ID,即使用户通过 su 命令临时切换至另一个用户,这个 ID 也不会改变。$UID 是一个只读变量,不能够被命令行或是脚本中的命令所修改,并与内建命令 id 相对应。
样例 9-5. 我是 root 用户吗?
#!/bin/bash
# am-i-root.sh: 我是否是 root 用户?
ROOT_UID=0 # Root 用户的 $UID 为 0。
if [ "$UID" -eq "$ROOT_UID" ] # 只有真正的 "root" 用户才能经受得住考研。
then
echo "You are root."
else
echo "You are just an ordinary user (but mom loves you just the same)."
fi
exit 0
# ============================================================= #
# 下面的代码将不会被执行,因为脚本已经退出了。
# 另外一种判断是否是 root 用户的方法:
ROOTUSER_NAME=root
username=`id -nu` # 或是... username=`whoami`
if [ "$username" = "$ROOTUSER_NAME" ]
then
echo "Rooty, toot, toot. You are root."
else
echo "You are just a regular fella."
fi
#!/bin/bash
# arglist.sh
# 在调用该脚本时需要跟上一些参数,例如 "one two three" ...
E_BADARGS=85
if [ ! -n "$1" ]
then
echo "Usage: `basename $0` argument1 argument2 etc."
exit $E_BADARGS
fi
echo
index=1 # 初始化计数器。
echo "Listing args with \"\$*\":"
for arg in "$*" # 如果这里没有引用 "$*",脚本将不会正常运行。
do
echo "Arg #$index = $arg"
let "index+=1"
done # $* 将所有参数视作一个单词。
echo "Entire arg list seen as single word."
echo
index=1 # 重置计数器。
# 如果忘了这一步将会发生什么?
echo "Listing args with \"\$@\":"
for arg in "$@"
do
echo "Arg #$index = $arg"
let "index+=1"
done # $@ 将所有参数视作独立的单词。
echo "Arg list seen as separate words."
echo
index=1 # 重置计数器。
echo "Listing args with \$* (unquoted):"
for arg in $*
do
echo "Arg #$index = $arg"
let "index+=1"
done # 未被引用的 $* 将所有参数视作独立的单词。
echo "Arg list seen as separate words."
exit 0
#!/bin/bash
# Bash 的内部变量 "$*" 和 "$@" 拥有不稳定的行为,
#+ 这些行为是否出现通常依赖于它们是否是被引用的状态。
# 下面的代码会演示在分词和换行时,这些变量所会出现的一些不一致的处理方式。
set -- "First one" "second" "third:one" "" "Fifth: :one"
# 设置脚本参数,$1, $2, $3 等等。
echo
echo 'IFS unchanged, using "$*"'
c=0
for i in "$*" # 被引用状态。
do echo "$((c+=1)): [$i]" # 这一行在下面所有的例子中都保持不变。
# 输出参数。
done
echo ---
echo 'IFS unchanged, using $*'
c=0
for i in $* # 未被引用状态。
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS unchanged, using "$@"'
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS unchanged, using $@'
c=0
for i in $@
do echo "$((c+=1)): [$i]"
done
echo ---
IFS=:
echo 'IFS=":", using "$*"'
c=0
for i in "$*"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using $*'
c=0
for i in $*
do echo "$((c+=1)): [$i]"
done
echo ---
var=$*
echo 'IFS=":", using "$var" (var=$*)'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using $var (var=$*)'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---
var="$*"
echo 'IFS=":", using $var (var="$*")'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using "$var" (var="$*")'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using "$@"'
c=0
for i in "$@"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using $@'
c=0
for i in $@
do echo "$((c+=1)): [$i]"
done
echo ---
var=$@
echo 'IFS=":", using $var (var=$@)'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using "$var" (var=$@)'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---
var="$@"
echo 'IFS=":", using "$var" (var="$@")'
c=0
for i in "$var"
do echo "$((c+=1)): [$i]"
done
echo ---
echo 'IFS=":", using $var (var="$@")'
c=0
for i in $var
do echo "$((c+=1)): [$i]"
done
echo
# 尝试在 ksh 或是 zsh -y 下执行这个脚本。
exit 0
# 这个样例是由 Stephane Chazelas 所编写,
#+ 由本书作者轻微改动。
类似于 递归。在本文中,嵌套是指代一种模式被嵌入在一种更大的模式中。在 1913 年出版的韦伯斯特大辞典中用一种更加优雅的方式解释了什么是嵌套:“一组按体积大小排列的盒子、箱子或是类似的东西,它们中的每一个都被放入到另一个更大的箱子中。(A collection of boxes, cases, or the like, of graduated size, each put within the one next larger.)”。