Shell变量和参数的介绍

来源:互联网 发布:绮罗香小说知夏 编辑:程序博客网 时间:2024/05/22 02:50
 
Shell变量和参数的介绍
1 变量替换($ 变量替换操作符)
只有在变量被声明,赋值,unset 或exported 或者是在变量代表一个signal 的时候,变量才会是以本来的面目出现在脚本里.变量在被赋值的时候:使用"="或read状态或是在循环的头部。
在""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变量替换,这叫做全引用,也叫强引用。
注意:$var 与${var}的区别,不加{},在某些上下文将引起错误,为了安全,使用2。
 
Example 1. 变量赋值和替换
#!/bin/bash
 
# 变量赋值和替换(# 强烈注意,在赋值的前后一定不要有空格.)
echo hello=”hello world”
echo hello # 没有变量引用,不过是个hello 字符串
echo $hello # hello world
echo ${hello} # 同上
echo "$hello" # 同上
echo "${hello}" # 同上
 
hello="AB C  D"
echo $hello # ABCD
echo "$hello" # AB C  D
# 就象你看到的echo $hello 和 echo "$hello" 将给出不同的结果.
# 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了.
echo '$hello'  # $hello(强引用将导致"$"变成一个单独的字符)
 
hello= # 设置为空值
echo "/$hello (null value) = $hello"
# 注意设置一个变量为空,与unset 它,不是一回事,虽然看起来一样
# 可以在同一行上设置多个变量.要以空白分隔,小心,这会降低可读性,和可移植性.
 
2 变量赋值(= 赋值操作符(前后都不能有空白))
# 赋值
a=879
echo "The value of /"a/" is $a."
# 使用let 赋值
let a=16+5
echo "The value of /"a/" is now $a. "
 
# 在for 循环中
for a in 7 8 9 11
do
echo -n "$a "
done
 
# 在read 命令状态中
read a
echo "The value of /"a/" is now $a."
 
变量赋值,一般的和比较特殊的
a=`echo Hello!` # 把echo 命令的结果传给变量a
a=`ls -l` # 把ls -l 的结果给a
echo $a  # 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行)
echo "$a" # 这么引用就正常了,保留了空白
 
使用$(...)机制进行的变量赋值(除去使用``来赋值的另外一种新方法).事实上这两种方法都是
命令替换的一种形式.
# 来自于/ect/rc.d/rc.local
R=$(cat /ect/redhat-release)
arch=$(uname -m)
 
3 Bash 变量是不分类型的
不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串.
但是依赖于上下文,Bash 也允许比较操作和算术操作.决定这些的关键因素就是,变量中的值
是否只有数字.
str=”BB23”
num=${str/BB/23}
let " num += 1"
echo num # 2324
 
4 特殊的变量类型
local variables
这种变量只有在代码块或者是函数中才可见
environmental variables
这种变量将改变用户接口和shell 的行为.
在一般的上下文中,每个进程都有自己的环境,就是一组保持进程可能引用的信息的
变量.这种情况下,shell 于一个一般进程是相同的.
每次当shell 启动时,它都将创建自己的环境变量.更新或者添加新的环境变量,将导
致shell 更新它的环境,同时也会影响所有继承自这个环境的所有子进程(由这个命令
导致的).
注意:分配给环境变量的空间是受限的.创建太多的环境变量将引起空间溢出,这会引
起问题.
 
5 位置参数
# 作为用例,调用这个脚本至少需要10 个参数,如
# ./scriptname 1 2 3 4 5 6 7 8 9 10
MINPARAMS=10
echo "The name of this script is /"$0/"."
# 添加./是为了当前目录
echo "The name of this script is /"`basename $0`/"."
# 去掉目录信息,具体见'basename'命令
 
if [ -n "$1" ] # 测试变量被被引用
then
echo "Parameter #1 is $1" # "#"没被转义
fi
# . . .
if [ -n "${10}" ] # 大于9 的参数必须出现在{}中.
then
echo "Parameter #10 is ${10}"
fi
echo "All the command-line parameters are: "$*""
 
if [ $# -lt "$MINPARAMS" ] #$#是传到脚本里的位置参数的个数
then
echo "This script needs at least $MINPARAMS command-line arguments!"
fi
 
# 参数替换的更好的办法应该是:
# ${1:-$DefaultVal}
 
Example 使用shift
#!/bin/bash
# 使用'shift'来穿过所有的位置参数.
 
# 把这个脚本命名为shft,
#+ 并且使用一些参数来调用它,如:
# ./shft a b c def 23 skidoo
 
until [ -z "$1" ] # 知道所有参数都用光
do
echo -n "$1 "
shift
done
 
echo # 额外的换行.
 
原创粉丝点击