码迷,mamicode.com
首页 > 系统相关 > 详细

linux基础之shell编程(1)

时间:2016-05-13 02:59:38      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:

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

哈哈,这样就搞定了~

linux基础之shell编程(1)

标签:

原文地址:http://blog.csdn.net/jianshijiuyou/article/details/51337101

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!