因为项目中要用到shell脚本,所以系统的看了一下。以前只是泛泛的了解。

变量:环境变量、预定义变量、位置变量、自定义变量。

环境变量这个好说,通过set或者env命令都能看到相应的列表,然后可以通过 echo ${VAR}显示出来。需要提一下,windows下也有环境变量,也可以使用echo %{VAR}%显示出来。

如:

[root@localhost]# env
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_TTY=/dev/pts/0
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
PWD=/root
JAVA_HOME=/opt/java
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root [root@localhost]# echo $USER
root [root@localhost]#

预定义变量,顾名思义,就是定义好的一些变量,如”$”/”?”/”!”。

作用分别是:代表当前pid、代表上一次执行的结果(returned num)、代表上一个后台进程pid!

如:

[root@localhost ~]# echo $$
2118 [root@localhost ~]# echo $?
0 [root@localhost ~]# echo $! [root@localhost ~]#

位置变量,其实是预定义变量的一种,$0~$9,以及${N}。代表了执行脚本时的参数。

如:假设我们有一个demo.sh脚本,当你执行 ./demo.sh p1 p2 p3 ..的时候,$0就是 ./demo.sh,$1就是p1,依次依此类推。

但还有三个预定义变量,分别是 “*”/”@”/”#”,分别代表了所有参数(作为整体)、所有参数(作为数组)、参数个数!

我们给定如下脚本  demo.sh:

#! /bin/bash

# 就示意前两个
echo "执行的命令是:$0"
echo "第一个参数是:$1" echo "参数的个数是:$#" # 这两个看起来一样,但用在for里面就能看出来了
echo "所有参数是:$*"
echo "所有参数是:$@" # 注意,要用双引号,否则就成了 for i in p1 p2 p3,和$@没区别了。。
for i in "$*"
do echo $i
done echo "---"
for i in "$@"
do echo $i
done
[root@localhost]# ./demo.sh 11 22 33 44 55
执行的命令是:./demo.sh
第一个参数是:11
参数的个数是:5
所有参数是:11 22 33 44 55
所有参数是:11 22 33 44 55
11 22 33 44 55
---
11
22
33
44
55 [root@localhost]#

自定义变量就不说了,同Java没啥区别。

运算

除了变量,接下来就是运算了,也就是表达式。

不过,别扭的是,shell一切皆字符串,这点太难受了

如:

[root@localhost ~]# x=3
[root@localhost ~]# y=4
[root@localhost ~]# z=$x+$y
[root@localhost ~]# echo $z
3+4 #这里是拼接了字符串,即没有数值类型
[root@localhost ~]#
[root@localhost ~]# z=$(($x+$y))
7 #$(()) 这样才是计算,还有declare -i z=$x+$y或者 z=$( expr $x + $y ) 但都不如$(())方便!
[root@localhost ~]#

建议使用 “$(( 计算表达式 ))”这种方式,因为其他两种都不方便!

不过要提一下declare!

declare –i 是视为整数(注意,不是浮点数)

declare –x 是导出为环境变量 (export就是这个的变体)

declare –p 是打印出变量的定义

declare –r 是设为只读(不能取消的那种。。。)

更别扭的是,如果你想取消设置,那需要把上面的减号”-“变成加号”+” -- 但是对只读无效。。。

上面是数值运算,接下来就是逻辑运算,也就是我们说的判断真假。

shell的判断有点像JSP中的EL表达式,其定义的运算符可以执行相应的运算,如-ge/-gt/-le/-lt/-eq/-ne/!/-z/-n/-d/-f/-e等等。

其实都是英文单词的首字母,很好理解也很好记 -- 除了 -z和-n,前者是为空判断,后者是非空判断,当成zero和not吧,太别扭了!

逻辑运算也有两种格式:

test –e “/root”    # 判断文件是否存在

[ 11 –gt 22 ]             # 判断 11 是否 大于 22

如何查看结果?可以通过 “echo $?”来查看!

但是,还有更简单的,就是使用 && 和 ||,如下:

test –e “/root”&& echo yes || echo no

[ 11 –gt 22 ] && echo yes || echo no

相等的判断,既可以用 ==,也可以用 -eq,不过后者仅能用于整数!

需要说明的是,单个等号=,也可以用于判断相等,但容易引起误解,所以务必不要使用!

运算之后,就该是控制语句了,我们都知道逻辑控制的三大语句if/for/while,shell都有。

其实对于已经掌握了任意一门编程语言的人来说,这一块很简单,只不过换了个形式。

if语句,例子:

#!/bin/bash

# 简单判断下本脚本的调用有没有附加参数,有的话输出下第一个参数
# 这里的$1就是前面提到的位置变量 - 预定义变量之一
if [ -z $1 ]
then
echo "你没有输入任何参数"
else
echo "你输入的第一个参数是:$1"
fi
#!/bin/bash

# 简单示意下 if .. elif .. else
file="/home/demo”
if [ -d $file ]
then
echo "$file 是一个目录"
elif [ -f $file ]
then
echo "$file 是一个文件"
elif [ -e $file ]
then
echo "$file 是存在的"
else
echo "file 不存在!"
fi

注意,不要忘了 thenfi

for语句例子:

#!/bin/bash

# 列出某个路径下的文件 注意,不要把$ls用双引号括起来
ls=$(ls /home/demo)
for i in $ls
do
echo $i
done # 求和:1... 100
sum=0
for ((i=1;i<=100;i++))
do
sum=$(( $sum+$i ))
done
echo $sum

while语句例子:

#!/bin/bash

# 求和,1.. 100
sum=0
i=1
while [ $i -le 100 ]
do
sum=$(( $sum+$i ))
i=$(( $i+1 ))
done echo $sum

其实还有一个until,和while的判断刚好相反,没必要看了。

还有一个case,个人觉得没必要看,也就算了。

shell编程小结的更多相关文章

  1. [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】

    第二章Shell的结构  “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...

  2. Linux 与 unix shell编程指南——学习笔记

    第一章    文件安全与权限 文件访问方式:读,写,执行.     针对用户:文件属主,同组用户,其它用户.     文件权限位最前面的字符代表文件类型,常用的如         d 目录:l 符号链 ...

  3. shell编程企业级实战(2)

    Vim配置文件.vimrc vim配置文件 if 条件语句 if是最常见的条件判断语句 例1:如果不存在/backup目录就创建. [root@web-01 /server/tools]# vim 0 ...

  4. shell编程企业级实战

    如何才能学好Shell编程 为什么要学习shell编程 Shell是Linux底层核心 Linux运维工作常用工具 自动化运维必备基础课程 学好shell编程所需Linux基础 熟练使用vim编辑器 ...

  5. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  6. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  7. 详解shell编程中2>&1用法

    在使用 linux 命令或者 shell 编程时,这个用法常会遇到 2>&1 下面看一个命令示例,然后分析下他是如何工作的: ls foo > /dev/null 2>&am ...

  8. 【shell】shell编程(五)-读取参数

    通过前几篇文章的学习,我们学会了shell的基本语法.在linux的实际操作中,我们经常看到命令会有很多参数,例如:ls -al 等等,那么这个参数是怎么处理的呢? 接下来我们就来看看shell脚本对 ...

  9. linux运维、架构之路-shell编程(一)

    一.shell编程入门必备基础 1.vim编辑器的命令,vimrc设置 2.150个linux基础命令 3.linux中基础的系统服务crond,ssh网络服务,nfs,rsync,inotify,l ...

随机推荐

  1. Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免?

    如题 Unix/Linux系统中僵尸进程是如何产生的?有什么危害?如何避免? 一个进程在调用exit命令结束自己的生命的时候,其实他并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结 ...

  2. adb -s

    当已经有多个设备连接到主机时,可以使用-s参数进行选择. 设备为adb devices列出的内容. 除此之外,-d表示只通过USB连接,-e表示只连接仿真器.

  3. javascript基础拾遗(四)

    1.什么是闭包 正常函数,执行完毕后相关的参数,变量就释放掉了. 当一个函数的返回值是另一个函数时,该函数的相关参数和变量都会保存在返回的函数中,这种结构叫做闭包. 2.示例 计算数组和 functi ...

  4. Asp.Net MVC TryUpdateModel使用说明

    修改功能每个网站里都有,也有很多写法 写法1:要修改的字段刚好等于表中的字段 [HttpPost] [ValidateAntiForgeryToken] public ActionResult Edi ...

  5. vue2.0如何自定义全局变量的方法

    方法一:http://www.jianshu.com/p/04dffe7a6b74 //在mian.js中写入函数 Vue.prototype.changeData = function (){ al ...

  6. Oracle中TO_DATE TO_CHAR格式

    TO_CHAR 是把日期或数字转换为字符串 TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_NUMBER 将字符转化为数字 TO_CHAR 使用TO_CHAR函数处理数字 TO_CH ...

  7. python 视频处理,提取视频相关帧,读取Excel

    一共这几个模块: class videoReader 读取视频 class videoFramesExtractor(videoReader):继承了读取视频,主要是用来限制读取视频中的哪些帧,并保存 ...

  8. JD 题目1040:Prime Number (筛法求素数)

    OJ题目:click here~~ 题目分析:输出第k个素数 贴这么简单的题目,目的不清纯 用筛法求素数的基本思想是:把从1開始的.某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉.剩下 ...

  9. 为什么页面设计宽度要控制在960px

    其实这里涉及到了一个网页栅格系统的问题,而且这个观念是从苹果的设计师那里来的 网站 首页页面宽度 px Yahoo! 950 淘宝 950 MySpace 960 新浪 950 网易 960 Live ...

  10. u-boot2011.09 启动流程记录

    start arch/arm/cpu/armv7/start.S 36 .globl _start 37 _start: b reset 136 reset: 137 bl save_boot_par ...