linux shell(二)shell 中的变量

一 linux shell变量基础:

在shell中取用变量需要在变量名前边加上一个"$"字符,“$”作为shell脚本中的一个保留字,表示变量的开始,与C语言不同的是,shell脚本中的变量在使用时候不需要提前定义,也即是每个变量都可以在程序员需要时候就使用。但其命名需要遵守下面规则:

(1) 首个字符必须为字母(a-z,A-Z)
(2)中间不能有空格,可以使用下划线(_)
(3)不能使用标点符号
(4)不能使用bash里的关键字(可用help命令查看保留关键字)
(5)需要给变量赋值时,可以这么写:
变量名=值
要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在"="两边留空格 ),这里注意$是在取用的时候(例如打印等等)才加的,而在像你初次使用并赋值时候则不用,直接就可以如下这样:
a="hello world"  #等号两边均不能有空格存在 
# 打印变量a的值: 
echo "A is:" $a

shell变量常见引用方式如下

关于上面${var:-newstring}及${var:=newstring}实验如下:
#!/bin/sh
# try ${var:-newstring} and ${var:=newstring}
echo ${var1:-hello}
echo "after var1=${var1}"
echo ${var2:=world}
echo "after,var2=${var2}"
var3="hi,var3"
echo ${var3:=new3}
echo ${var3}
var4="hello,var4"
echo ${var4:=new hello4}
echo ${var4}

运行后输入如下:
[root@localhost Desktop]# ./b.sh
hello
after var1=
world
after,var2=world
hi,var3
hi,var3
hello,var4
hello,var4
所以看到他的区别就是当var未定义或者为空时候都是返回了newstring,但是对于${var:=newstring}则将newstring赋值给了var,而${var:-newstring}没有.
结合上一节的内容,各位看官可以将变量的各种引用形式用个小例子实验一下。

变量类型

在上一节中就说过,shell中的变量是没有类型区分的。本质上,变量中的值都是以字符串的形式保存的,在对变量的解释上依赖于shell脚本中的变量定义。如下:


例如,整形变量也是一个字符串,shell允许比较操作和整数操作, 其中关键因素是这个整形变量中的值是否只有数字,如果只有数字则在进行整数操作时候将其解释为一个整形,如果变量中还含有其他字符则解释为字符串,即使使用declare命令也不能更改其类型。

Linux Shell下的变量按其使用目的可以分为4种类型。

环境变量:用于保存操作系统运行时使用的环境变量。

位置变量:Bash将传递给脚本的参数保存在位置变量中,以便于在脚本中引用这些参数。

预定义变量:由系统保留和维护的一组特殊的变量,这些变量通常用于保存程序运行状态等。

自定义变量:由用户自行定义的变量

环境变量

环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux 的环境变量具有继承性,即子shell 会继承父shell 的环境变量。但注意本地变量(局部变量不具有继承性)。

当你进入系统的时候,linux 就会为你读入系统的环境变量,这些环境变量存放在什么地方,那就是环境变量的文件中。主要涉及的是/etc/下的profile,profiled,bashrc及~/.bashrc , ~/.bash_profile,~/. bash_logout 对系统初始化有些了解的应该能大致理解下,简单来说就是:bash首先执行/etc/profile脚本,/etc/profile脚本先依次执行/etc/profile.d/*.sh 随后bash会执行用户主目录下的.bash_profile脚本,.bash_profile脚本会执行用户主目录下的.bashrc脚本, 而.bashrc脚本会执行/etc/bashrc脚本 至此,所有的环境变量和初始化设定都已经加载完成. bash随后调用terminfo和inputrc,完成终端属性和键盘映射(咱们有空再详细去看下里边各个脚本做了什么~)

几个命令:

1 env或者printenv打印当前系统中的环境变量。

2 环境变量的设置

 var=vaule

常见变量

3 ENV 每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc

4  BASH 展开为调用bash实例时使用的全路径名

5 HISTFILE 指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位,交互式shell退出时将不保存命令行历史
6 HISTSIZE 记录在命令行历史文件中的命令数。默认是500

7 EUID 展开为在shell启动时被初始化的当前用户的有效ID
8 GROUPS 当前用户所属的组

9 UID 展开为当前用户的用户ID,在shell启动时初始化

10 PPID 父进程的进程ID

11 PS1 主提示符串,默认值是$
12 PS2 次提示符串,默认值是>

13 HOME 主目录。未指定目录时,cd命令将转向该目录

14 PWD 当前工作目录。由cd设置

15 LANG 用来为没有以LC_开头的变量明确选取的种类确定locale类

16 PATH 命令搜索路径。一个由冒号分隔的目录列表,决定了shell将到哪些目录中寻找命令或程序

17 RANDOM 每次引用该变量,就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化

尝试在终端中试下上面的几个变量值

[root@localhost ~]# echo $BASH
/bin/bash
[root@localhost ~]# echo $HISTFILE
/root/.bash_history
[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# echo $EUID
0
[root@localhost ~]# echo $PID

[root@localhost ~]# echo $PPID
8071
[root@localhost ~]# echo $GROUPS
0
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $ps1

[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $PWD
/root
[root@localhost ~]# echo $LANG
en_US.UTF-8
[root@localhost ~]# echo $RANDOM
12635

位置变量

在运行一个shell时候可以向脚本传递命令行参数,这些命令行参数可以在shell脚本内部被引用,根据每一个命令参数的位置,在shell中可以使用$1到$9来表示。其中$0表示当前执行进程的文件名,也就是程序的执行文件名。另外,还有

$#:传入脚本的参数的个数
$*:所有的位置参数(作为单个字符串) 
$@:所有的位置参数(每个都作为独立的字符串)。

例子:

#!/bin/sh
# try location var
echo N0 $0
echo N1 $1
#echo N2 $2
echo N3 $3
echo N4 $4
echo N5 $5
echo N6 $6
echo N7 $7
echo N8 $8
echo N9 $9
echo all $#
echo they are $*
echo $@
运行:

[root@localhost Desktop]# ./b.sh ar1 ar2 ar3
N0 ./b.sh
N1 ar1
N3 ar3
N4
N5
N6
N7
N8
N9
all 3
they are ar1 ar2 ar3
ar1 ar2 ar3

预定义变量

预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,像上面在说位置变量里边说道的$#,$*,$@都是。常用的Shell预定义变量有:
$# 位置参数的数量。
$* 所有位置参数的内容。
$?:当前shell进程中,上一个命令的返回值,如果上一个命令成功执行则$?的值为0,否则为其他非零值,常用做if语句条件
$$ 当前进程的进程号。
$! 后台运行的最后一个进程号。
$0 当前执行的进程名。

对于自定义变量,就是用户使用时候定义的,参见第一部分的规则来就OK







评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值