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