shell:属于弱类型编程语言
什么是弱类型,什么是强类型?
- 强类型:变量在使用前,必须事先声明,甚至还需要初始化;
- 弱类型:变量用时声明,甚至不区分类型;
变量赋值,引用
赋值:VAR_NAME=VALUE
引用:${VARNAME} (花括号一般可以省略)
例:
[root@iZ28g26851kZ ~]# name=test --赋值
[root@iZ28g26851kZ ~]# echo $name --引用
test
[root@iZ28g26851kZ ~]#
bash变量类型
- 环境变量
export VARNAME=VALUE ; 作用域为当前shell进程及其子进程。
命令行中启动的脚本会继承当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要的各环境变量;
例:
[root@iZ28g26851kZ ~]# JAVA_HOME=/opt/java/jdk7/ [root@iZ28g26851kZ ~]# export JAVA_HOME [root@iZ28g26851kZ ~]# echo $JAVA_HOME /opt/java/jdk7/ [root@iZ28g26851kZ ~]#
- 本地变量
set VARNAME=VALUE: 作用域为整个bash进程;(set关键字 可以省略)
- 局部变量
local VARNAME=VALUE:作用域为当前代码段;(local 是关键字)
- 位置变量
$1,$2, ...
位置变量是用来引用脚本的参数的
- 特殊变量
特殊变量是用来保存一些特殊数据的。
$?:上一个命令的执行状态返回值;
例:
[[email protected] ~]# ls libiconv-1.14 mhash-0.9.4.tar.gz mysql-5.1.51.tar.gz nginx-1.8.0.tar.gz libiconv-1.14.tar.gz mysql-5.1.51 nginx-1.8.0 [[email protected] ~]# echo $? 0 [[email protected] ~]# lsss -bash: lsss: command not found [[email protected] ~]# echo $? 127 [[email protected] ~]#
可以看出,当执行命令成功和失败时,$? 的值是不同的
0: 正确执行
1-255:错误执行;(1,2,127系统预留)
/dev/null
软件设备,bit bucket,数据黑洞
什么意思呢?
当命令执行的结果我们不需要显示出来时,就可以重定向到/dev/null中,数据不会在/dev/null中保存,所以不会产生垃圾数据
例:
[root@iZ28g26851kZ ~]# ls &> /dev/null
[root@iZ28g26851kZ ~]# cat /dev/null --可以发现,数据并不存在
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]# lsss &> /dev/null
[root@iZ28g26851kZ ~]# echo $?
127
[root@iZ28g26851kZ ~]#
这样就可以只获取命令是否执行成功的状态,而不需要知道命令执行的详细结果
释放(撤销)变量
unset VARNAME
例:
[root@iZ28g26851kZ ~]# echo $name
test
[root@iZ28g26851kZ ~]# unset name
[root@iZ28g26851kZ ~]# echo $name
[root@iZ28g26851kZ ~]#
操作变量时,什么时候加$符号,什么时候不加$符号
- 操作变量本身不需要加$符号
- 操作变量的值要加$符号
查看当前shell中的变量
set 不加任何参数可以列出当前所有变量
查看当前shell中的环境变量
printenv
env
export
给字符串变量追加值
对于shell来说,默认所有的变量都是字符串
[root@iZ28g26851kZ ~]# mylist=www
[root@iZ28g26851kZ ~]# mylist=${mylist}qqq
[root@iZ28g26851kZ ~]# echo $mylist
wwwqqq
[root@iZ28g26851kZ ~]#
那么问题来了,如果设置java的环境变量?
[root@iZ28g26851kZ ~]# export PATH=$PATH:${JAVA_HOME}/bin
[root@iZ28g26851kZ ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/java/jdk7/bin
[root@iZ28g26851kZ ~]#
当然这样只是临时的,退出当前shell后就失效了
如何让自己写的文件当脚本执行
在文件开头加上 #!/bin/bash
就行了
#! 叫 shebang(魔数) ,用来指定脚本解释器的路径,所以这里写上/bin/bash
就行了
例:
#!/bin/bash
#这是注释
ls -al
~
~
将文件保存为list.sh(当然文件名可以随便写)
此时文件还没有x权限
-rw-r--r-- 1 root root 33 May 7 12:00 list.sh
添加权限
[root@iZ28g26851kZ ~]# chmod +x list.sh
好,现在执行,
[root@iZ28g26851kZ ~]# list.sh
-bash: list.sh: command not found
[root@iZ28g26851kZ ~]#
居然不行???,
好吧,其实是当执行一个命令时,系统默认会先去环境变量的路径下寻找可执行程序,
也可以直接给定可执行程序的路径,
[[email protected] ~]# ./list.sh
total 30364
dr-xr-x---. 5 root root 4096 May 7 12:03 .
dr-xr-xr-x. 22 root root 4096 Dec 27 23:24 ..
-rw------- 1 root root 12296 May 7 08:52 .bash_history
-rw-r--r--. 1 root root 18 May 20 2009 .bash_logout
-rw-r--r-- 1 root root 270 May 7 08:52 .bash_profile
-rw-r--r--. 1 root root 176 Sep 23 2004 .bashrc
-rw-r--r--. 1 root root 100 Sep 23 2004 .cshrc
-rw------- 1 root root 41 May 3 17:36 .lesshst
、、、、、、、、、、、、、、、、、
-rw-r--r--. 1 root root 129 Dec 4 2004 .tcshrc
-rw------- 1 root root 6937 May 7 12:03 .viminfo
[[email protected] ~]#
哈哈,这样就搞定了~