本文为本人学习笔记,如有转载请注明出处,谢谢

一、Bourne Shell 有如下四种变量:

  1. 用户自定义变量
  2. 位置变量,即命令行参数
  3. 预定义变量
  4. 环境变量

二、位置变量

$ 与键入的命令行一样,包含脚本文件名

$, $, ……. $  分别包含第一个到第九个命令行参数

$#  包含命令行参数的个数

$@ 包含所有命令行参数: “$, $, ……. $”会一个一个拆分解析

$?  包含前一个命令的退出状态

$*  包含所有命令行参数: “$, $, ……. $”所有包括在一起解析的

$$  包含正在执行进程的ID号

三、环境变量

ts.sh

#!/bin/sh

echo  “PATH=$PATH”

./ts.sh

HOME :   /etc/passwd文件中列出的用户主目录

IFS:   Internal Field  Separator,默认为空格,tab及换行符

PATH: shell 搜索路径

PS1, PS2:  默认提示符($)及换行提示符( > )

TERM:  终端类型,常用的有vt100, ansi, vt200, xterm等

四、read用法

read 从标准输入读入一行,并赋值给后面的变量,其语法为:

read var

把读入的数据全部赋值给var

read  var1  var2  var3

把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量

如果执行read语句时标准输入无数据,则程序在此停留等候,知道数据的到来或被终止运行

#!/bin/sh

read val val2 val3

echo "val=$val"

echo "val2=$val2"

echo "val3=$val3"

五、shell编程代码剖析

#!/bin/sh

#位置变量
#$ 与键入的命令行一样,包含脚本文件名
#$, $, ……. $ 分别包含第一个到第九个命令行参数
#$# 包含命令行参数的个数
#$@ 包含所有命令行参数: “$, $, ……. $”会一个一个拆分解析
#$? 包含前一个命令的退出状态
#$* 包含所有命令行参数: “$, $, ……. $”所有包括在一起解析的
#$$ 包含正在执行进程的ID号 #. shell头文件
echo "hello world" #2. 用户自定义变量
echo "please input your num:" #接收用户输入信息
# read num
# echo "num = $num" #3. 预定义变量
num=
echo "num = $num" #4. 位置变量
echo "*********<<test1>>*********************"
# $ $ $ $ $
# ./ts1.sh
echo "argv[0]=$0"
# echo "argv[1]=$1"
echo "argv[2]=$2"
# echo "argv[3]=$3"
# echo "argv[4]=$4"
echo "argc =$#" ls ./
echo "exit = $?" # 正常退出= ls ./xxx
echo "exit = $?" # 异常退出>
echo "*************<<test2>>*****************" #5. 特殊符号
echo "num = $num" # 双引号是保留特殊字符
echo 'num = $num' # 单引号当做字符串
echo `pwd` # 反单引号解析为shell 命令 echo "**************<<test3>>****************" #6. 环境变量
echo "PATH=$PATH" #7. 算术运算
num=
sum="expr $sum \* 6"
echo "sum=$sum"
echo $sum
sum='expr $sum \* 6'
echo "sum=$sum"
echo $sum
sum=`expr $num \* `
echo "sum=$sum"
echo $sum #. 逻辑运算 # test 表达式
# 比较字符串 比较整数 比较文件 #. shell 控制语句 # if switch for while break ... # 方法一 判断输入参数的个数是否小于3
if [ $# -lt ]
then
echo "argc is less than 3"
else
echo "argc is great than 3"
fi # 方法二 if [ $# -lt ] ; then
echo "argc is less than 3"
else
echo "argc is great than 3"
fi echo "******************************" # case esac 多路分支语句 case $ in
hello)
echo "case: hello"
;;
sky)
echo "case: sky"
;;
other)
echo "case: other nothing"
;;
*)
echo "case: * none"
;; esac echo "******************************" # for语句
for name in $@
do
case $ in
hello)
echo "case: hello"
;; sky)
echo "case: sky"
;;
other)
echo "case: other nothing"
;;
*)
echo "case: * none"
;; esac
done
echo "******************************" #while语句
num=
sum=
while [ $num -gt ]
do
sum=`expr $sum + $num`
num=`expr $num - `
done
echo "sum=$sum"
echo "******************************" #break and continue
echo "**********break and continue*******************" if [ $# = ]
then
echo "Numberic arguments required"
exit
fi if [ $# -gt ] #所有位置参数
then
echo "Only ten arguments allowed"
exit
fi for number
do
count=`expr $number % ` #用2求模,count的值只能是0或1
if [ $count -eq ] # 是奇数
then
continue #下一轮循环
else
output="$output $number" #偶数放到偶数队列中
fi
done
echo "Even number: $output" echo "******************************" # 10. 函数调用
# 函数不需要指定是返回什么类型
my_func()
{
set -x
echo "my function"
sum=`expr $ + $`
echo "sum=$sum"
return $sum
set +x
}
my_func
echo "sum2=$?"
echo "******************************"

六、test语句的使用

test语句可测试三种对象:

字符串  整数  文件

每种测试对象都有若干测试操作符

例如:

test  “$answer”= “yes”

变量answer的值是否为字符串yes

test  $num  -eq  18

变量num的值是否为整数18

test  –d tmp

测试tmp是否为一个目录名

  1. 字符串测试

s1 = s2  测试两个字符串的内容是否完全一样

s1 != s2  测试两个字符串的内容是否有差异

-z s1     测试s1字符串的长度是否为0

-n s1     测试s1字符串的长度是否不为0

  1. 整数测试

a –eq b  测试a与b是否相等

a –ne b  测试a与b是否不相等

a –gt b  测试a是否大于b

a –ge b  测试a是否大于等于b

a –lt b   测试a是否小于b

a –le b   测试a是否小于等于b

  1. 文件测试

-d name 测试name是否为一个目录

-f name 测试name是否为普通文件

-L name  测试name是否为符号链接

-r  name  测试name文件是否存在且为可读

-w  name   测试name文件是否存在且为可写

-x  name  测试name文件是否存在且为可执行

-s  name   测试name文件是否存在且其长度不为0

f1 –nt f2   测试文件f1是否比文件f2更新

f1 –ot f2  测试文件f1是否比文件f2更旧

七、shell控制语句

1)if…then…fi

语法结构:

if  表达式

then 命令表

fi

如果表达式为真,则执行命令表中的命令;否则退出if语句执行fi后面的语句

if和fi是条件语句的语句括号,必须成对使用;

命令表中的命令可以是一条,也可以是若干条

2)case…esac

多路分支语句case用于多重条件测试,语法为:

case 字符串变量 in

模式1)

命令表1

;;

模式2)

命令表2

;;

……

模式n)

命令表n

;;

esac

注意:

case语句只能检测字符串变量

各模式中可用文件名元字符,以有括号结束

命令表以单独的双分号行结束,退出case语句

模式n常写为字符* 表示所有其它模式

最后一个双分号行可以省略

3)for…do…done

当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。循环体由语句括号do和done来限定。格式为:

for 变量名  in  单词表

do

命令表

Done

变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条,也可以是由分号或换行符分开的多条。

如果单词表是命令行上的所有位置参数时,可以在for语句中省略“in 单词表”部分。

4)while…do…done

语法结构为:

while  命令或表达式

do

命令表

done

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

while语句的退出状态为命令表中被执行行的最后一条命令的推出状态

5)until…do…done

语法结构:

until 命令或表达式

do

命令表

done

until循环与while循环的功能相似,所不同的是只有当测试的命令或表达式的值是假时,才执行循环体中的命令表,否则退出循环

6)break和continue

break  n 则表示跳出n层;

continue语句则马上转到最近一层循环语句的下一轮循环上,

continue  n则转到最近n层循环语句的下一轮循环上

八、shell编程调试技巧

1)跟踪脚本执行结果

在开始调试的地方加入:set –x

在结束调试的地方加入:set +x

#一个循环测试的demo
#!/bin/sh
count=
sum=
while [ $count -le ]
do
if [ $count = ]
then
echo "break count=$count"
break
fi
sum=`expr $sum + $count`
count=`expr $count + `
echo "count=$count"
sleep
done
echo "sum=$sum"

#!/bin/sh                                                                                                                              
 
 echo "zbh"
 #if [ $1 = "1" ]; then
     cd .. && pwd
 #fi
     echo "zbh ******* end"

执行此文件时,要使用source,否则脚本会在子进程中执行,从而当前控制台的路径不会改变。

欢迎交流,下面是我的联系方式:

qq:920052390

新浪博客:http://blog.sina.com.cn/u/2049150530

博客园:http://www.cnblogs.com/sky-heaven/

知乎:http://www.zhihu.com/people/zhang-bing-hua

shell编程学习笔记【原创】的更多相关文章

  1. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  2. shell编程学习笔记(一):编写我的第一段代码

    目前在学习Shell编程,我会把我的学习笔记记录在这里.大神可以直接略过~ 嗯,第一段代码,肯定是要输出Hello World了~ 以下蓝色字体的内容为linux命令,红色字体的内容为输出的内容: # ...

  3. shell编程学习笔记(十):Shell中的for循环

    shell编程中可以实现for循环遍历 先来写一个最简单的吧,循环输出从1到10,脚本内容为: #! /bin/sh for i in {1..10} do echo $i done 上面的代码从1到 ...

  4. shell编程学习笔记之sed编辑器

    在shell编程中,大多数处理的都是文本文件.对文本文件进行处理除了使用交互式文本编辑器(vi[m],gedit......)也可以使用另外一类:流编辑器. 流编辑器:使用预定义的编辑规则来对文本进行 ...

  5. shell编程学习笔记(八):Shell中的if条件判断

    编程语言中都有条件判断,shell编程也不例外,下面我们来看一下shell中应该怎么使用if条件判断 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/scripts ...

  6. shell编程学习笔记(六):cat命令的使用

    这一篇不是讲shell编程的,专门讲cat命令.shell编程书用到了这个cat命令,顺便说一下cat命令. cat命令有多种用法,我一一来列举(以下蓝色字体部分为Linux命令,红色字体的内容为输出 ...

  7. shell编程学习笔记(五):Shell中脚本的参数

    在执行Shell脚本的时候,可以在执行时带上参数,相当于传递参数给脚本,下面我们看一下怎么使用这个参数 以下蓝色字体部分为Linux命令,红色字体的内容为输出的内容: # cd /opt/script ...

  8. shell编程学习笔记之特殊变量($0、$1、$2、 $?、 $# 、$@、 $*)

    特殊变量($0.$1.$2. $?. $# .$@. $*) shell编程中有一些特殊的变量可以使用.这些变量在脚本中可以作为全局变量来使用. 名称 说明 $0 脚本名称 $1-9 脚本执行时的参数 ...

  9. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

随机推荐

  1. Linux YUM (Yellowdog Updater, Modified) Commands for Package Management

    Linux YUM (Yellowdog Updater, Modified) Commands for Package Management In this article, we will lea ...

  2. Android 拍照或相册选择照片进行显示缩放位图 Demo

    拍照后直接使用 BitmapFactory.decodeStream(...) 进行创建 Bitmap 并显示是有问题的. Bitmap 是个简单对象,它只存储实际像素数据,也就是说,即使原始照片已压 ...

  3. 图的最短路径:Dijkstra 和 Floyd

    //最短路径 /* dijkstra Dijkstra(迪杰斯特拉)算法的核心思想是贪心策略+动态规划 http://www.programgo.com/article/4721147659/ Dij ...

  4. StaticBox布局管理器

    wx.StaticBoxSizer构造方法如下: wx.StaticBoxSizer(box,orient = HORIZONTAL) box 是静态框对象,orient参数是布局方向  wx.HOR ...

  5. Asp.net获取网站绝对路径的几种方法

    在编写ASP.NET应用程序的时候,有时候为了更好的进行控制静态文件的路径,以及网站部署过程中的虚拟路径等问题,采用绝对路径避免资源出现Not Found,下面先看看几种获取绝对路径的方法: 1. 以 ...

  6. 遍历列表,打印:我叫name,今年age岁,家住dizhi,电话phone(我是通过下标取键得到对应值,有哪位大神来个更简单的)

    lt = [ {'name':'小王', 'age':18, 'info':[('phone', '123'), ('dizhi', '广州')]}, {'name':'小芳', 'age':19, ...

  7. 聊聊、Git 常用命令

    创建本地仓库git initgit add .git commit -m "xxxxx"git remote add origin http://git.xxx.com/xxx.g ...

  8. 什么是EM算法?

    开头借用李航老师书中总结,概率模型有时既含有观测变量,又含有隐藏变量或者潜在变量,如果概率模型的变量都是观测变量,那么给定数据,可以直接用极大似然估计法,或者贝叶斯估计法估计模型参数,但是,当模型含有 ...

  9. php 根据文件内容来判断文件类型

    /*文件扩展名说明 *7173 gif *255216 jpg *13780 png *6677 bmp *239187 txt,aspx,asp,sql *208207 xls.doc.ppt *6 ...

  10. poj 2151 概率DP(水)

    Check the difficulty of problems Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5750   ...