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 ~]#
哈哈,这样就搞定了~
相关文章推荐
- shell脚本中echo显示内容带颜色
- shell编程中的单引号和双引号的使用
- shell基础
- shell文件属性判断
- Get-adServerSetting和Set-ADServerSetting-Exchange Management Powershell 命令同步博客!
- C++/Php/Python/Shell 程序按行读取文件或者控制台
- shell 和awk性能对比
- shell sed 实现文本替换
- -bash: ./****.py: /usr/bin/python^M: bad interpreter: No such file or directory
- how to custom bash prompt
- 客户端putty xshell连接linux中vim不能正常使用小键盘的问题
- shell 教程
- shell 教程
- shell 教程
- shell 教程
- shell 教程
- kali webshell
- linux里source、sh、bash、./有什么区别
- PowerShell调用jira rest api实现对个人提交bug数的统计
- 怎么让adb shell直接进入root?