当前位置:   article > 正文

Linux shell编程(三)shell脚本中的特殊变量详解_shell脚本中变量的特殊处理怎么写

shell脚本中变量的特殊处理怎么写
(1)环境变量(全局变量)
环境变量一般使用export内置命令导出的变量,用于定义shell运行环境,保证shell命令能够正确执行,
shell通过环境变量来确定登录的用户名等信息,所有的环境变量都是系统的全局变量。
环境变量可以在命令行中创建,但是当用户退出命令行时这些变量将会丢失,如果需要永久保存环境变量,
那么就可以在用户家目录下的.bash_profile 或者 .bashrc 按照系统的规范在设置环境变量时所有的环境变量名采用大写的方式;

   环境变量按生存周期来划分:
   1.环境变量永久变量:需要修改配置文件如:/etc/profile文件或者/etc/profile.d目下的文件中声明的,还有一个就是在用户家目录下的.bash_profile和.bashrc文件。
   2.环境变量临时变量:使用export命令声明即可,变量在关闭shell时失效。
   定义好了变量文件,修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。

 
(2)普通变量(局部变量)
局部变量只能在创建它的shell脚本和函数中使用,如果在shell中启动另一个进程或退出,这个局部变量也将无效。
普通变量定义,变量名由字母开头,后面可以接下划线和数字
1.变量名=value     一般定义数字时使用,连续的字符串,如果不是连续的有空格的,就要用双引号。
2.变量名='value'   原样输出,不解析。
3.变量名="value"   双引号内可以有变量,输出变量时双引号内的变量会经过解析后,输出该变量的内容。

1.例:
a=172.16.70.71
a=172.16.70.71-$a
b='172.16.70.71-$a'
c="172.16.70.71-$a"

echo "a=$a"
echo "b=$b"
echo "c=$c"

输出结果:
[root@computer1 ~]# echo "a=$a"
a=172.16.70.71-172.16.70.71
[root@computer1 ~]# echo "b=$b"
b=172.16.70.71-$a
[root@computer1 ~]# echo "c=$c"
c=172.16.70.71-172.16.70.71-172.16.70.71
[root@computer1 ~]# 

2.例:
执行linux命令,用反引号``引起来.
echo "`date`"

Mon Jun  4 15:42:43 CST 2018


(3)查看环境变量
env命令:输出当前用户的变量;
set命令:输出全部的变量;
export命令:输出导出的全局变量;
declare命令:输出全部的变量、函数、整数和已经导出的变量;
linux 分 shell变量(set),用户变量(env), shell变量包含用户变量,export是一种命令工具,是显示那些通过export命令把shell变量中包含的用户变量导入给用户变量的那些变量.


(4)自定义环境变量
1)设置环境变量
增加一个环境变量TEST。
1. export TEST="hello world"  或者先定义TEST="hello world" ;再导出export TEST (一次可以导出多个)
2. declare -x TEST="hello world"

2)取消环境变量
unset命令来清除环境变量,注意set,env,export设置的变量,都可以用unset来清除。
删除一个环境变量TEST,清除环境变量的值用命令。如果未指定值,则该变量值将被设为NULL。
unset TEST 

查找TEST环境变量,没有输出证明环境变量TEST已经删除
env|grep TEST 

    
(5)系统内置的常用变量

$BASH BASH的二进制文件问的路径
$BASH_ENV BASH的启动文件
$BASH_VERSINFO[n] BASH版本信息,有六个元素
$BASH_VERSION BASH版本号
$EDITOR 脚本所调用的默认编辑器
$EUID 当前有效的用户ID
$FUNCNAME 当前函数名
$GROUPS 当前用户所属组
$HOME 当前用户家目录
$HOSTTYPE 主机类型
$LINENO 当前行号
$OSTYPE 操作系统类型
$PATH PATH路径
$PPID 当前shell进程的父进程ID

$PWD 当前工作目录
$SECONDS 当前脚本运行秒数
$TMOUT 不为0时,超过指定的秒将退出shell
$UID 当前用户ID

(6)shell的特殊变量

$0 当前脚本的名字
$n 传递给脚本或者函数的参数,n表示第几个参数,从第1个参数开始
$# 传递给脚本或函数的参数个数

$* 传递给脚本或函数的所有参数
$@ 传递给脚本或者函数的所有参数
$$ 当前shell脚本进程的PID

$? 函数返回值,或者上个命令的退出状态

1)$?用于判断上一个命令是否执行成功,如果成功为0。

返回值 含义
0 表示运行成功
2 权限拒绝
1~125 运行失败,脚本命令、系统命令错误或参数传递错误
126 找到命令但是无法执行
127 未找到要运行的命令
>128 命令被系统强制结束

2)$0当执行脚本是全路径的时候,$0也会带路径
些时可以用dirname和basename将$0中的路径和名称分别取出来
vim /root/test003.sh
#!/bin/bash
dirname $0
basename $0


再用全路径执行该脚本:
[root@computer1 ~]# sh /root/test003.sh 
/root
test003.sh

dirname和basename命令可以直接输出路径和名称:
[root@computer1 ~]# dirname /var/log/messages
/var/log
[root@computer1 ~]# basename  /var/log/messages
messages


(7)$* 和 $@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时:
"$*" :会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;

"$@" :会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。 

$* 将命令行所有参数视为单个字符串,等同于"$1$2$3"
$@ 将命令行每个参数视为单独的字符串,相当于"$1""$2""$3"。这种方式会保留所有内嵌在参数的任何白,都能传递给其它程序。


set -- "who are " your me #set命令传入参数
1.)$*不加引号
[root@compute1 ~]# for i in $*;do echo $i;done 
who
are
your

me

2.)“$*”$*加引号
[root@compute1 ~]# for i in "$*";do echo $i;done                    
who are your me

3.)$@不加引号
[root@compute1 ~]# for i in $@;do echo $i;done
who
are
your
me

4.)"$@" $@加引号
[root@compute1 ~]# for i in "$@";do echo $i;done 
who are
your
me

(8)变量取值
有4种方式:
1.$NAME
2.${NAME}
3.$"NAME"
4."${NAME}"

newdate=$(date +%F)
花括号取变量时如:tar zcf message_$newdate_http.tar.gz
此时shell产生歧义,将$newdate_http 整体看成了变量,所以这时要用大括号如:
将/var/log/下所有文件和目录打包
tar zcvf messages_${newdate}_log.tar.gz /var/log/

tar zcvf messages_`uname -n`_log.tar.gz /var/log/

(9)将命令定义为变量

1.用反引号: 
[root@computer1 ~]#newcmd=`ls`
[root@computer1 ~]# echo $newcmd
anaconda-ks.cfg cobbler.ks ks-post.log ks-post-nochroot.log ks-pre.log linux-auto-init.sh 

2.用$+圆括号:(推荐)
[root@computer1 ~]# newcmd=$(date)
[root@computer1 ~]# echo $newcmd  
Mon Jun 4 15:51:32 CST 2018


(10)例子详解
runlevel=$(set -- $(runlevel); eval "echo \$$#" ) 

1.)直接输入runlevel 
N 3
得到2个参数,其中3就是当前运行级别

2.)set -- $(runlevel) 就是将runlevel运行的结果: N 3做为参数

3. )eval "echo \$$#" ,其中$#就是求出上面的参数的个数,刚才为2个,即$2取的值就是3
   eval二次扫描,首先扫描到echo输出$2,第二次解析$2的值为等级3


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/215959
推荐阅读
相关标签
  

闽ICP备14008679号