您的位置:首页 > 运维架构 > Shell

三、变量:shell变量的定义、使用、重命名、只读变量、删除变量、变量类型、特殊变量

2017-08-07 15:58 501 查看
shell变量是支持自定义的

(1)定义变量(等号两边不能有空格)

eg:

name="Lucy"


定义变量:变量名=”变量值”,

注意:

变量名前面不要加$,不需要指定变量类型

变量名和等号之间不能有空格

变量命名规则:字下美人其后数

(字–字母)(下–下划线)(美人–美元符号)(其后–后面)(数–数字)

首字符必须为字母(a-z,A-Z)

中间不能有空格,可以有下划线_

不能使用标点符号

不能用bash里的关键字(用help命令可以查看保留关键字)

(2)使用变量

变量引用:变量名前加 $

eg1:

name="Lucy"
echo "她叫: $name hahah"


eg2:

name="Lucy"
echo "她叫: ${name} hahah"


注意:

变量引用:给变量名加{}或者 在$前面加空格,变量名后面加空格;或标点符号;不这样做有时候无法识别变量

(3)变量重命名(已定义的变量可以重新定义)

name="Lucy"
echo ${name}
name="小琪"
echo ${name}


注意:二次赋值不能写成 name="小琪",引用时候才加

(4)只读变量

用readonly命令将普通变量定义成为只读变量,只读变量的值不能修改

eg:(改为只读变量和赋值同时进行正确,否则错误)

#!/bin/bash
readonly Myname="Lucy"
echo ${Myname}


eg:(尝试更改只读变量)

#!/bin/bash
Myname="Lucy"
echo ${Myname}
readonly Myname
Myname="明明"
echo ${Myname}


运行结果:

[root@h data]# ./n1.sh
Lucy
./n1.sh: line 5: Myname: readonly variable
Lucy


错误:只读变量无法识别

./n1.sh: line 5: Myname: readonly variable
Lucy


(5)删除变量

使用unset命令删除变量;

语法:

unset 变量名

eg:(删除普通变量)

#!/bin/bash

name="小琪"
echo ${name}
unset name
echo ${name}


变量删除之后不能再次使用;unset不能删除只读变量

eg:(删除只读变量)

#!/bin/bash

name="小琪"
echo ${name}
readonly name
echo ${name}
unset name
echo ${name}


运行结果:(不能删除只读变量)

./n3.sh: line 7: unset: name: cannot unset: readonly variable
小琪


(6)变量类型

1局部变量

在脚本和命令中使用,仅仅在当前shell脚本中有效,其他脚本无法使用该局部变量

2环境变量

所有的shell脚本都能访问该变量,环境变量可以自己定义

3 shell变量

shell变量是shell脚本的特殊变量

(7)特殊变量:$$,$0,$1,$*,$@

1)普通变量和特殊变量

普通变量:

字下美人其后数

特殊变量:包含一些其他符号;例如:$$,$0,$1,$*,$@

$表示当前shell脚本的进程号PID 25363

eg:

#!/bin/sh
echo $$


执行结果:

[root@h data]# /bin/sh ./t.sh
25363


2)特殊变量使用表:

变量 意义

$$ 当前shell脚本的进程(PID)25363

$0 当前shell脚本的文件名

$n 传递给脚本的参数,n可以写成除0以外的参数,eg:$1表第一个参数;$2表第二个参数

$* 以一个字符串的形式显示所有参数

$@ 显示所有参数,加”“后就和$*不一样,(下面案例)

$? 上一个命令的退出状态,或者函数的返回值。0表示成功 1表失败 如果上一条不是前两种情况是方法,返回一个方法的返回值

$# 返回传递给脚本的参数个数

eg1:

#!/bin/bash

name="小花"
age=“16”
sex=“女”
echo "我是${name},芳龄$age,$sex"
echo "当前shell脚本的PID:$$"
echo "当前shell脚本的文件名:$0"
echo "返回当前shell脚本的第一个参数:$1"
echo "返回当前shell脚本的第三个参数:$3"

echo "以一个字符串的形式显示所有参数:$*"
echo "$@"
echo "显示所有参数:$@"

echo "上一个命令的退出状态:$?"
echo "返回传递给脚本的参数个数:$#"


执行结果:这种情况是因为参数不是传进去的

[root@h data]# /bin/sh ./t1.sh
我是小花,芳龄“16”,“女”
25522
./t1.sh


显示所有参数:

0
0


eg2:vi t2.sh

echo $$
echo $0
echo $1
echo $3
echo $*
echo $@
echo "显示所有参数:$@"
echo $?
echo $#


执行:
/bin/sh t2.sh "a" "b" "c" "d"


结果:

[root@h data]# /bin/sh t2.sh "a" "b" "c" "d"
25544
t2.sh
a
c
a b c d
a b c d
显示所有参数:a b c d
0
4


错误执行方式:

/bin/sh t2.sh "a b c d"
/bin/sh t2.sh "a,b,c,d"


结果:

[root@h data]# ./a.sh "a b c"
当前shell脚本的PID:27575
当前shell脚本的文件名:./a.sh
返回当前shell脚本的第一个参数:a b c
返回当前shell脚本的第三个参数:
以一个字符串的形式显示所有参数:a b c
a b c
显示所有参数:a b c
上一个命令的退出状态:0
返回传递给脚本的参数个数:1


3)∗和@的区别?

eg1:

echo $*
echo $@
执行结果:
[root@h data]# /bin/sh ./t1.sh "a" "b" "c" "d"
a b c d
a b c d


eg2:

echo "--------\例一:$*--------"
for i in "$*";do
echo $i
done

echo "--------\例二:$@--------"
for i in "$@";do
echo $i
done


执行结果:

[root@h data]# /bin/sh ./t2.sh "a" "b" "c" "d"
--------\例一:a b c d--------
a b c d
--------\例二:a b c d--------
a
b
c
d


总结:

相同点:∗和@:在不使用for循环时,效果都一样,都是一个参数一个参数来显示,eg:”1""2”“3""4”

a b c d

a b c d

不同点:加for循环

∗:把所有参数当成一个参数来显示(一个字符串)@:把各个参数分开显示(eg:for循环换行显示i)

4)退出状态

$? 上一个命令的退出状态,或者函数的返回值。0表示成功 1表失败 如果上一条不是前两种情况是方法,返回一个方法的返回值

返回值:可以指定 exit n(n可以随便指定一个数值) exit 46

eg 1:

exit 3
echo $?


执行结果:

[root@h data]# vi t4.sh
[root@h data]# /bin/sh ./t4.sh
[root@h data]# echo $?
3

$?还可以表示函数返回值,后面讲函数时讲解


eg 2:

#!/bin/bash
var1=1
var2=3
var3=$[$var1+$var2]
echo the answer is $var3
echo "执行成功"
echo $?
执行:
[root@h data]# ./t3.sh
the answer is 4
0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 变量
相关文章推荐