shell变量(环境变量、参数变量)实例详解

我只简单的总结Shell变量常见的使用情况, 变量的详细信息参考:http://lovelace.blog.51cto.com/1028430/1211141
 
1.变量的赋值

格式: NAME=value (注意等号两边不能有空格)

name=proinsight    # 正确   方法1

name = proinsight  # 错误,不能有空格

name="proinsight"  # 正确   方法2

name='proinsight'  # 正确   方法3

如果传入的值中不包含空格等分割符, 采用方法1,2,3。如果传入的值中包含空格等分割符,采用方法2,3。如果传入的值包含其它变量,采用方法2。

如何将hello world 赋值给sentence变量:

sentence="hello world"  # 正确

sentence='hello world'  # 正确

sentence=hello world    # 错误

sentence="hi, $name"   #正确,sentence值为: hi, proinsight

sentence='hi, $name'   #错误,sentence值为: hi, $name

小结:" "(双引号) 与 ' ' (单引号) 的区别

  1. 在双引号中,变量名称将被变量值所替代。

  1. 在单引号中,变量名称,或者任何其他文本都会不经修改而传出来。
  • 变量的调用

在变量前加$,同样,变量的调用也有三种方法

name="proinsight"

echo $name    #方法1

echo ${name}  #方法2

echo "$name"  #方法3

通常情况下方法1、2、3都可以。只是在一些特殊条件下,方法1无法处理

如何输出name值的同时加入abc后缀,既输出proinsightabc

echo $nameabc   #错误,会把nameabc看成一个变量,并输入变量值。

echo ${name}abc #正确

2.环境变量

当shell脚本运行时,一些变量会根据环境设置中的值进行初始化,这些变量通常以大写字母命名,区别于用户以小写字母命名的局部变量。一些通用的环境变量如下图所示:

复制代码
$HOME:    当前用户的家目录
$PATH:    以冒号分割的用来搜索命令的目录
$PS1:     命令提示符,通常是$字符,如:[\u@\h\w]$
$PS2:     二级提示符,用来提示后续的输入,通常是>
$IFS:   输入域分隔符,通常是空格、制表符、换行符
$0:    SHELL脚本的名字
$#:       传递给脚本的参数个数
$$:       shell脚本的进程号,通常用来生成唯一的临时文件,如/tmp/tmpfile_$$
复制代码

3.参数变量

其实,当我们执行一个 shell script 时,在这个 shell script 里面就已将帮我们做好一些可用的变量了。 举例来说,在不久的将来,您就会发现,当我们要启动一个系统服务时,可能会下达类似这样的指令: 
[root@linux ~]# /etc/init.d/crond restart 

那是啥玩意儿?呵呵!就是『向 /etc/init.d/crond 这个 script 下达 restart 的指令』, 咦!我们不是都使用 read 来读取使用者输入的变量内容吗?为啥我可以直接在 script 后面接上这个参数? 这是因为 shell script 帮我们设定好一些指定的变量了!变量的对应是这样的: 

/path/to/scriptname  opt1  opt2  opt3  opt4  ... 
       $0             $1    $2    $3    $4   ... 

这样够清楚了吧?执行的文件名为 $0 这个变量,第一个接的参数就是 $1 啊~ 所以,只要我们在 script 里面善用 $1 的话,就可以很简单的立即下达某些指令功能了!  其它的一些预设参数如下:

复制代码
$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFS被修改了,那么$*命令分割参数的方式将随之改变。
    与位置变量不同,此选项参数可超过 9个,如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $$ : 脚本运行的当前进程 ID号 $! : 后台运行的最后一个进程的进程 ID号 $@ : 是$*的一种精巧变体,它不使用IFS,使用时加引号,并在引号中返回每个参数,双引号里的$@把各个参数扩展为彼此分开的域,所以即使IFS为空,参数也不会挤在一起。
   一般来说,你想访问shell脚本程序的参数,推荐使用$@。
  
"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$
- : 显示shell使用的当前选项,与 set命令功能相同。
$
? : 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
复制代码
实例:
复制代码
# Program:
#       This program will show the use of shell variable
# History:
# 2015/1/4 Alex First release
 
# $0:.......
echo "path of script : $0"
# ..basename...........
echo "name of script : $(basename $0)"
# $1...1
echo "parameter 1 : $1"
# $2...2
echo "parameter 2 : $2"
# $3...3
echo "parameter 3 : $3"
# $4...4
echo "parameter 4 : $4"
# $5...5
echo "parameter 5 : $5"
# $#:..........
echo "The number of arguments passed : $#"
# $*:........i
echo "Show all arguments : $*"
# $:.......ID.
echo "Process ID : $$"
# $?:...
echo "errors : $?"
 
测试:
deyuy/bin/my_shell >> ls -l |grep var.sh
-rw-rw-r--   1 deyuy    deyuy        607 Jan  4 02:09 var.sh
deyuy/bin/my_shell >> chmod 755 var.sh
deyuy/bin/my_shell >> ls -l |grep var.sh
-rwxr-xr-x   1 deyuy    deyuy        607 Jan  4 02:09 var.sh
deyuy/bin/my_shell >> ./var.sh
path of script : ./var.sh
name of script : var.sh
parameter 1 :
parameter 2 :
parameter 3 :
parameter 4 :
parameter 5 :
The number of arguments passed : 0
Show all arguments :
Process ID : 25860
errors : 0
以上我们只输入了./var.sh,没有输入任何参数,下面我们输入3个参数老虎、狼、兔子对比一下:
deyuy/bin/my_shell >> ./var.sh tiger wolf rabbit
path of script : ./var.sh
name of script : var.sh
parameter 1 : tiger
parameter 2 : wolf
parameter 3 : rabbit
parameter 4 :
parameter 5 :
The number of arguments passed : 3
Show all arguments : tiger wolf rabbit
Process ID : 18818
errors : 0
复制代码
有了这些预设变量,我们可以再我们的脚本里进行很多处理,而不必关注具体传递的参数是什么,是不是很好用!
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值