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

linux基础之shell编程(1)

2016-05-07 12:08 645 查看

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, ...


位置变量是用来引用脚本的参数的

特殊变量

特殊变量是用来保存一些特殊数据的。

$?:上一个命令的执行状态返回值;

例:

[root@iZ28g26851kZ ~]# 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
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]# lsss
-bash: lsss: command not found
[root@iZ28g26851kZ ~]# echo $?
127
[root@iZ28g26851kZ ~]#


可以看出,当执行命令成功和失败时,$? 的值是不同的

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 ~]#


居然不行???,

好吧,其实是当执行一个命令时,系统默认会先去环境变量的路径下寻找可执行程序,

也可以直接给定可执行程序的路径,

[root@iZ28g26851kZ ~]# ./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
[root@iZ28g26851kZ ~]#


哈哈,这样就搞定了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: