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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/play_chess_ITmanito/article/details/76850272

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

猜你喜欢

转载自blog.csdn.net/play_chess_ITmanito/article/details/76850272