Linux Shell

Shell变量分为环境变量、自定义变量、特殊变量。

环境变量

环境变量又分为系统环境变量和用户环境变量,这些变量都写在配置文件中,Shell启动时加载配置。

全局配置文件

/etc/profile

/etc/profile.d/*.sh

/ect/bashrc

个人配置文件

~/.bash_profile

~/.bashrc


增加环境变量

编辑/etc/profile

export MY_NAME=mslh

重新加载配置文件

source /etc/profile

读取环境变量

# echo $MY_NAME

自定义变量

格式:变量名=变量值

注意点:

1. 变量名命名由字符、数字和下划线组成,不能以数字开头,不能使用关键字(系统占用的名称)。

2. 等号两边不能有空格。

3. 在bash环境中,所有变量默认都是字符串类型,无法直接进行数值运算。

4. 变量值中存在空格,需要使用双引号括起来。


局部变量

局部变量一般只能在同一个Shell、脚本、函数中使用。

增加局部变量(修改类似,不存在该变量则新增该变量)

# app_name=miselehe

使用变量,需要使用“$”开头

# echo $app_name
miselehe
# app_name_2=$app_name
# echo $app_name_2
miselehe

删除变量,使用unset命令,并且变量不使用$开头

# unset app_name
# echo $app_name

注意:shell中的任何变量$后都可以放到大括号“{}”中。


全局变量

定义全局变量和局部变量基本相同,只是全局变量需要使用export命令声明下。

举例:创建a.sh和b.sh,脚本a中创建局部变量var_a和全局变量var_b并执行脚本b,b中打印两个变量

# vim a.sh
#!/bin/bash

var_a=局部变量
export var_b=全局变量

# 执行脚本b.sh
sh b.sh


# vim b.sh
#!/bin/bash

echo 文件a.sh创建的局部变量'$var_a'=${var_a}

echo 文件a.sh创建的全局变量'$var_b'=${var_b}

执行

# sh a.sh 
文件a.sh创建的局部变量$var_a=
文件a.sh创建的全局变量$var_b=全局变量

可以看出b.sh可以调用a.sh定义的全局变量。


常量或只读变量

即定义后不能修改变量值的变量。使用readonly命令

# appName=mslh
# echo $appName
mslh
# readonly appName
# appName=miselehe
-bash: appName: readonly variable
# echo $appName 
mslh

只读常量不能使用unset删除,目前只能通过退出shell并重新登录

# unset appName
-bash: unset: appName: cannot unset: readonly variable

脚本中更改只读变量会出错,终止脚本执行

vim /root/shell/readonlyvar.sh 

#!/bin/bash
# 这里定义一个变量
appName=mslh

echo 定义的变量appName=${appName}

# 将变量设置为只读变量
readonly appName

# 尝试更改只读变量的值
appName=misilehe

echo 尝试更改只读变量的值后appName=${appName}

执行

# sh readonlyvar.sh 
定义的变量appName=mslh
readonlyvar.sh: line 11: appName: readonly variable


特殊变量

$n 获取脚本执行时的参数

$0或${0} 获取当前脚本名称,在shell中表示获取shell的登录环境。

获取参数是从1开始的,使用方式${n}, 0-9可以省略大括号,10以后必须使用大括号

$# 获取参数个数

也可是使用${#}

$* 获取所有参数

$*和$@都是获取所有参数

区别:shell中的变量是可以放在双引号中的,并且双引号中的变量也会被解析

不使用双引号

        功能相同,返回都内容都可以理解为字符串数组。

使用双引号

        “$*” 获得结果为“$1 $2 $3” (所有变量值作为由空格分隔的一个大字符串)

        “$@”获得结果为“$1” “$2” “$3” (可理解为字符串数组)

$? 户获取上一个命令退出状态码或函数的返回值

一般在进程或函数执行完成后,会调用exit方法,后可增加状态码“exit 状态码”,返回0 代表命令执行成功。

$$ 当前Shell进程的ID

在shell中执行脚本时,会新创建一个进程,所以在shell中获取的进程ID和脚本中的进程ID是不一样的。


举例: vim /root/shell/specialVariables.sh

#!/bin/bash

# 双引号中的变量会被解析
echo "当前脚本进程号: $$"

:<<!
echo 命令 参数都为字符串可不使用双引号,可以存在空格
如果是定义变量,存在空格必须使用引号。
!

echo 上一个指令echo输出进程号退出状态码是: $?

echo "当前脚本文件名称: $0"

# 单引号内的变量不会被解析
echo '当前脚本参数总个数$#='$#

echo 当前脚本第三个参数$3

echo 当前脚本第十个参数${10}

echo '$*不使用双引号'
for var in $*
do
echo $var
done

echo '$@不使用双引号'
for var in $@
do
echo $var
done

echo '$*'使用双引号
for var in "$*"
do
echo $var
done

echo '$@'使用双引号
for var in "$@"
do
echo $var
done

执行

# sh specialVariables.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
当前脚本进程号: 121173
上一个指令echo输出进程号退出状态码是: 0
当前脚本文件名称: specialVariables.sh
当前脚本参数总个数$#=15
当前脚本第三个参数3
当前脚本第十个参数10
$*不使用双引号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$@不使用双引号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$*使用双引号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$@使用双引号
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

以上示例中可以看出 $* 和 $@ 在使用双引号后的不同。



转载请指明出处!http://www.miselehe.com/article/view/124