变量名是其所指向值的一个占位符(placeholder)。引用变量值的过程我们称之为变量替换(variable substitution)
变量替换
$variable 这种写法是 ${variable} 的简化形式。在某些特殊情况下,使用 $variable 写法会造成语法错误,使用完整形式会更好
# 初始化变量时,赋值号 = 的两侧绝不允许有空格出现。
VARIABLE =value
# 脚本将会尝试运行带参数 "=value" 的 "VARIABLE " 命令
# 脚本将会尝试运行 "value" 命令
# 同时设置环境变量 "VARIABLE" 为 ""
hello="A B C D"
echo $hello # A B C D
echo "$hello" # A B C D
# 正如我们所见,echo $hello 与 echo "$hello" 的结果不同。
# ====================================
# 字符串内引用变量将会保留变量的空白符。
# ====================================
#一个未被赋值或未初始化的变量拥有空值(null value)。注意:null值不等同于0。
if [ -z "$unassigned" ]
then
echo "\$unassigned is NULL."
fi # $unassigned is NULL.
变量赋值 【 "=" 前后不能有空格】
a=879
echo "The value of \"a\" is $a."
# 在 'for' 循环中赋值(隐式赋值)
echo -n "Values of \"a\" in the loop are: "
for a in 7 8 9 11
do
echo -n "$a "
done
# 酷炫的赋值
a=`echo Hello!` # 将 'echo' 命令的结果赋值给 'a'
a=$(echo Hello!)
# 注意在命令替换结构中包含感叹号(!)在命令行中使用将会失效,
# 因为它将会触发 Bash 的历史(history)机制。
bash变量是弱类型的
本质上说,Bash 变量是字符串,但在某些情况下,Bash 允许对变量进行算术运算和比较。决定因素则是变量值是否只含有数字
为了减轻脚本持续跟踪变量类型的负担,Bash 不允许变量声明
# 在执行算术运算时,Bash 通常将其空值的整数值设为0, 但是不要做这种事情
e='' # ...也可以是 e="" 或 e=
echo "e = $e" # e =
let "e += 1" # 空值是否允许进行算术运算?
echo "e = $e" # e = 1
特殊的变量类型
局部变量
仅在代码块或函数中才可见的变量
环境变量
会影响用户及shell行为的变量
每当shell启动时,都会创建出与其环境对应的shell环境变量。改变或增加shell环境变量会使shell更新其自身的环境。子进程(由父进程执行产生)会继承父进程的环境变量
如果在脚本中设置了环境变量,那么这些环境变量需要被“导出”,也就是通知脚本所在的环境做出相应的更新。这个“导出”操作就是 export 命令
位置参数
$0, $1, $2, $3 ... 即命令行参数, 在 $9 之后的参数必须被包含在大括号中,如 ${10}, ${11}, ${12}
if [ -n "$1" ] # 测试变量是否存在
then
echo "Parameter #1 is $1" # 使用引号转义#
fi
if [ $# -lt "$MINPARAMS" ]
then
echo
echo "This script needs at least $MINPARAMS command-line arguments!"
fi
# 通过 {} 获取最后一个参数
args=$# # 传入参数的个数
lastarg=${!args}
# 这是 $args 的一种间接引用方式
也可以使用: lastarg=${!#}
# shift 命令可以将全体位置参数向左移一位, 重新赋值, $1 <--- $2, $2 <--- $3, $3 <--- $4,以此类推
# 原先的 $1 将会消失,而 $0(脚本名称)不会有任何改变。如果你在脚本中使用了大量的位置参数,shift 可以让你不使用{大括号}助记法也可以访问超过10个的位置参数
until [ -z "$1" ] # 直到访问完所有的参数
do
echo -n "$1 "
shift
done
唯爱与技术不可辜负
网友评论