Linux Unix shell 编程指南学习笔记(第四部分)

第十六章  shell脚本介绍

此章节内容较为简单,跳过。

第十七章   条件测试

test命令

expr命令

test 

格式  test  condition     或者  [ condition ]  (注意: condition两侧有空格)

文件状态测试:

- d	目录		;	- s	文件长度大于0、非空	;	- f	正规文件
- w	可写		;	- L	符号连接			;	- u	文件有s u i d位设置
- r	可读		;	- x	可执行

测试的逻辑操作符:

-a   :逻辑与,操作符两边均为真,结果为真,否则为假。

-o   : 逻辑或,操作符两边一边为真,结果为真,否则为假。

!   : 逻辑否,条件为假,结果为真。

字符串测试:

=     两个字符串相等。		;	!=   两个字符串不等。
-z    空串。			;	-n    非空串。

数值测试:

-eq   数值相等。			;	-ne   数值不相等。
-gt   第一个数大于第二个数。	;	-lt   第一个数小于第二个数。
-le   第一个数小于等于第二个数。<span style="white-space:pre">	</span>;	-ge   第一个数大于等于第二个数。

expr(一般用于整数值  也可以  用于字符串 , expr 测试成功返回  1  , 其他值为错误)

格式: expr     argument     operator    argument

对数字: expr   number1    [+ - * / 等]  number2

对字符串: expr  string1  [=  模式匹配等 ]

expr的模式匹配: expr  string  : pattern

第十八章 控制流程

退出状态

while、for 和 until loop 循环

if  then else 语句

脚本中动作

菜单

退出状态

使用 $?  查看最后退出状态。主要有4种退出状态,即 $ ?和控制次序命令($ $、| |)。其余两种是处理s h e l l脚本或s h e l l退出及相应退出状态或函数返回码。

退出当前进程 exit  n  , n 为一个数值。键入e x i t,s h e l l将试图(通常是这样)返回上一个命令返回值

循环

for
循环每次处理依次列表内信息,直至循环耗尽。

Until 循环 此循环语句不常使用,u n t i l循环直至条件为真。条件部分在循环末尾部分。

While 循环 w h i l e循环当条件为真时,循环执行,条件部分在循环头。

if  then else  语句(也可以检测命令是否成功返回)

if  条件1
	then  命令1
	elif	条件2
		then 命令2
	else 命令3
fi

样例代码

#!/bin/bash
# it is used to create a file which add header "#!/bin/bash" automatically
filename=$1
# get the first parameter used as filename
#echo $filename
if [!$filename ]; then
        read var
        filename=$var
else
        echo $filename
fi
echo '#!/bin/bash' > $filename # write data to filename
vim $filename # open file with vim editor

一段简单脚本代码,在当前目录下创建一个当前目录不存在的文件,键入 文件名 -h 还可以查看帮助文档。

#!/bin/bash
fname=$1
function help(){
    echo "this is a simple helper document for use this tool";
    echo "basic form : ./newFile [option] [filename]";
    echo -e  "\t -h\t print this help page"
}
if [ $fname ]; then
    case $fname in
    -h) help;exit;;
    esac
    fileArray=$(ls -a)
    for aFile in $fileArray; do
        if [ $aFile = $fname ]; then
            echo " file $fname already exits ."
            exit
        fi
    done;
else
    echo "please input a file name that will be created ! "
    exit
fi
touch $fname && echo "file  $fname  create success !"

if 检查命令执行结果

#!/bin/bash
#name:  if_test_comman
if grep -nr "good" ./ > /dev/null 2>&1
    then echo "string good found !"
    else echo "there isn't a string called good under $PWD"
fi

测试传递参数个数: if [ $# lt n ] ;then 命令  ; 如果传入参数少于 n  个, 那么执行命令。

判断脚本是否为交互模式(终端模式)还是非交互模式(c r o n或a t): if [  -t ]

检测前面最近一个的命令状态: if [ $? = 0  ] ; then 命令

case 语句 (模式中可以是常量和变量)

<span style="font-size:14px;"><strong>case   值   in
模式1)命令...;;
模式2)命令...;;
模式3)命令...;;
......
esac</strong></span>

模式中还可以包含元字符:

*   任意字符。;?任意单字符。;[..]   类或范围中任意字符。

#!/bin/bash
case $1 in
        "1") echo "one";;
        "2") echo "two";;
        "3") echo "three";;
        "4") echo "four";;
        "5") echo "five";;
        "6"|"six") echo "six";;
        *)echo "unknown data $1"
esac <span style="color:#006600;">  </span>

for 循环  

for  值    in   列表(如果不指定列表,默认取位置参数)
do
      命令...
done

使用for循环显示所有的位置参数(可以是任意个数的参数)

#!/bin/bash
#name:  for_use_geovar
echo -e "location variables are : \c"
for VAR   # the same as “in "[email protected]"” or  "in "$*""
do
    echo -e  $VAR "\c"
done
echo ""

嵌套for循环

for  变量名1  in列表1
d o
<span style="white-space:pre">	</span>for  变量名2  in  列表2
<span style="white-space:pre">	</span>d o
<span style="white-space:pre">		</span>命令1
<span style="white-space:pre">		</span>. . .
<span style="white-space:pre">	</span>d o n e
d o n e

until 循环(一般可用while循环替代,通常情况while循环优于until循环)

until  条件
do
<span style="white-space:pre">	</span>命令1
<span style="white-space:pre">	</span>. . .
d o n e

while 循环

while  命令
d o
<span style="white-space:pre">	</span>命令1
<span style="white-space:pre">	</span>. . .
d o n e

while从文件中读取数据:

<span style="font-size:14px;"><strong>while read LINE
do
XXX
echo $LINE
done  < filename</strong></span>

break 和 continue 适合于 case 和循环。

第十九章    shell 函数

shell 函数定义:一组命令集或语句组成的可用块。

函数的组成: 函数标题   和   函数体。

使用函数可以节省大量的脚本编写时间。创建可用和可重用的脚本很有意义,可以使主脚本变短,结构更加清晰。

定义函数

在脚本中使用函数

在函数文件中使用函数

函数举例

定义函数(所有函数在使用前必须定义)

定义函数的格式为:

[function]  函数名(){
    命令1
    ...
}

在脚本中使用函数:

#!/bin/bash
function hello(){
    echo "hellow ting , nice to meet you !"
}

echo "today is `date`"
hello
echo "I'm glad to see you again ~_~!"

向函数中传递参数

想函数传递参数跟向脚本传递参数一样(使用位置变量参数 $1,$2,...),函数取得所传参数后,将原始参数传回shell脚本。函数离调用参数的转换以下划线开始,后加变量名,如 : _key。

从调用函数中返回

1、函数正常执行到函数末尾,然后返回脚本中调用函数的控制部分。

2、使用return返回

return   	从函数中返回,使用最后状态命令决定返回值
return 0 	无错误返回
return 1	有错误返回

函数返回值测试:

hello
if [ $? =0 ] ; then
或者
if  hello ; then

在shell中使用函数

1、创建函数文件 (任意文件)

2、将函数文件载入shell  (.  函数文件位置)(可以通过set查看所有载入当前shell的函数,unset删除shell函数)

3、执行shell函数   (函数名称   参数 ....)

如:  函数文件 funs.h

#!/bin/bash 

function find_file(){
    tarName=$1;
    if [ -n tarName ]; then
            find ./ -name ${tarName}
    else
            echo "please input a file name ."
    fi
}

将该文件载入shell : . funs.h

执行函数: find_file    filename(任意字符串)

在脚本中调用函数

要在脚本中调用函数,必须先定义该函数(在调用之前)。

在脚本中调用函数文件中的函数:

1、首先创建函数文件

2、在脚本文件中载入函数文件(跟在shell中载入函数文件类似)

3、调用函数

如: call_fun.sh 和 funs.h 文件在同一个目录,其内容如下:

#!/bin/bash
. funs.h
find_file $1

第二十章  向脚本传递参数

shift

getopts

shift

shift作用: 在向脚本传递参数时,shift 可以将每一个参数向左偏移一位。

#!/bin/bash
while [ $# -ne 0 ]   #while ther are still arguments
do
    echo $1
    shift
done

最后一个参数获取的方法:

eval echo \$$#     或   shift 'expr $# -2'

通过验证在ubuntu12.04上 第二个命令应该为 : shift  `expr $# - 1` ; shift 后接偏移的数量然后用$1 就可以取得该值。  如  lastVar.sh :

#!/bin/bash
shift `expr $# - 1`
echo $1

./lastVar.sh file name good   , 输出结果为good

getopts

如果要控制诸如  command  -l    -c      23    -v       file1      file2    时,shift命令就不够了,此时该用getopts命令。

getopts 格式:  getopts  varString  variable

#!/bin/bash 

ALL=false
HELP=false
FILE=false
VERBOSE=false

while getopts ahfv OPTION
do
    case $OPTION in
    a) ALL=true;        echo "ALL is $ALL";;
    h) HELP=true;       echo "HELP is $HELP";;
    f) FILE=true;       echo "FILE is $FILE";;
    v) VERBOSE=true;    echo "VERBOSE is $VERBOSE";;
    esac
done

如果参数中包含一个未指定的选项参数 ,如 ./getopts_test.sh -p 则提示: ./getopts_test.sh: illegal option -- p

getopts指定变量必须取值:将冒号放在选项后面,如对上述代码   ahfv 修改为 ahfvt: ,那么t必须指定取值。

使用方法为  ./getopts -[a h f v] -[t value] XXX

第二十一章   创建屏幕输出

tput命令

使用转义序列和产生控制码

使用颜色

tput

使用tput前,需要先初始化:  tput  init

常用字符串:

  名字              含义
  b e l              警铃
  b l i n k          闪烁模式
  b o ld             粗体
  c i v i s          隐藏光标
  c l e a r          清屏
  c n o r m          不隐藏光标
  c u p              移动光标到屏幕位置(x,y)
  e l                清除到行尾
  e l l              清除到行首
  s m s o            启动突出模式
  r m s o            停止突出模式
  s m u l            开始下划线模式
  r m u l            结束下划线模式
  s c                保存当前光标位置
  rc                 恢复光标到最后保存位置
  s g r 0            正常屏幕
  r e v              逆转视图

常用数字:

	名字			含义
	c o l s			列数目
	i t			t a b设置宽度
	l i n e s		屏幕行数

bool操作符

	名字			含义
	c h t s			光标不可见
	h s			具有状态行

通过发送命令打开和关闭光标(Linux/BSD):

echo -e "\033[?25h"     和    echo -e "\033[?25l"

System V :

echo "\033[?25h"       和  echo "\033[?25l" 

发送命令清屏,并且将光标移动到左上角(Linux/BSD)

echo -e "\033[2J"

使用颜色:

产生颜色格式 : escape [ background_color;foreground_color m

linux/bsd : echo -e "\033[40;33m"  (黑色背景,黄色字体)

第二十二章   创建屏幕输入

几乎都是实例操作代码,略过。

第二十三章  调试脚本

一般错误

set命令介绍

一般错误

1、循环错误

2、漏泄引号

3、测试错误 [ condition ] , condition 两边都有空格。

4、字符大小写

5、for循环  注意$符号

6、echo  , 不要在echo命令后直接加最后状态命令,此时值永远为真

set命令 (-打开选项, +关闭选项)

set [-n (读命令但不执行)     |     -v(显示读取的所有行)     |    -x(显示所有的命令及其参数)]

第二十四章   shell 嵌入命令

shell 嵌入命令在 bourne shell 里面创建而不是存在于 /bin 或  /usr/bin目录里。相同的命令 ,嵌入命令要比系统命令要快。

标准的bourne shell  嵌入命令列表

:		空,永远返回为t r u e
.		从当前shell中执行操作
break		退出for、while、until或case语句
cd		改变到当前目录
continue	执行循环的下一步
echo		反馈信息到标准输出
eval		读取参数,执行结果命令
exec		执行命令,但不在当前shell
exit		退出当前shell
export		导出变量,使当前  shell  可利用它
pwd		显示当前目录
read		从标准输入读取一行文本
readonly	使变量只读
return		退出函数并带有返回值
set		控制各种参数到标准输出的显示
shift		命令行参数向左偏移一个
test		评估条件表达式
times		显示  shell 运行过程的用户和系统时间
trap		当捕获信号时运行指定命令
ulimit		显示或设置  shell  资源
umask		显示或设置缺省文件创建模式
unset		从  shell  内存中删除变量或函数
wait		等待直到子进程运行完毕,报告终止

set在脚本内部给出运行参数(主要作用是用于测试脚本的时候避免每次都要输入参数):

#!/bin/bash
set ting er xy
while [ $# != 0 ]
do
    echo $1
    shift
done

如果执行脚本时带了参数,那么后面的参数会被脚本内部的参数给覆盖掉。

times : times第一行给出shell消耗时间,第二行给出运行命令消耗时间

type: 查询命令是否仍驻留系统及命令类型。

#!/bin/bash
set cd good
while [ $# != 0 ]
do
    if type $1 > /dev/null 2>&1;then
        echo "command $1 is still in shell ."
    else
        echo "the command $1 not found ."
    fi
    shift
done

用type 查询命令是否驻留在系统中,屏蔽type的输出,使用我们自定义的输出。

ulimit:设置运行在shell上的显示限制

-a 显示当前的所有限制

-c 限制内核垃圾大小

-f  限制运行进程输出文件的大小

wait :等待子进程完成,不带进程id会等待所有的子进程完成。

时间: 2024-08-01 22:43:53

Linux Unix shell 编程指南学习笔记(第四部分)的相关文章

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位

Linux Unix shell 编程指南学习笔记(第五部分)

第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符,该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比如: cat >> tmpfile <<DOC > this is the first line > this is the second line > third > forth >..... >DOC 其中DOC就是分界符,再次在新的行中输入DOC时

Linux Unix shell 编程指南学习笔记(第三部分)

第十三章  登陆环境 登陆系统时,输入用户名和密码后,如果验证通过,则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profile /etc/passwd 文件解析(抽取其中的一行作为示例): 1 2 3 4 5 6 7 root: <span style="white-space:pre"> </span>x: 0: 0: root: <span style="white-space:pre&

Linux Unix shell 编程指南学习笔记(第二部分)

第七章  正则表达式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配任意单字符. ^,在行首 匹配字符串或字符序列,如查询当前目录下的所有目录: ls -l | grep "^d" 在行尾以 "$"匹配字符串或字符  , 匹配所有以sh结尾的行: sh$ 匹配所有的空行: ^$ 使用*匹配字符串中单字符或重复序列: skdf*jl 使用 \ 转义特殊字符的含义: 特殊字符:   $  .   ''  '   *  [  ]

Linux与Unix shell编程指南(完整高清版).pdf

找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题.本书内容全面.文字简洁流畅,适合Shell编程人员学习.参考. 目      录 译者序 前言 第一部分   shell 第1章   文件安全与权限 1 1.1   文件 1 1.2   文件

“Linux Shell编程”视频学习笔记

一.Linux Shell基础编程 视频1 1.1.查看你系统shell信息 $ cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 $ echo $SHELL 命令可以查看当前你所使用的shell是哪一个 1.2.查看文件信息,ls $ ls -l 查看文件信息:文件类型.文件权限.文件硬链接数.文件所属用户.文件所属组.文件大小.文件最近修改时间.文件名 1.3.改变文件权限,chmod 只有root用户或者文件的所有者能改变文件的权限 例子:$ chmod

Hive编程指南学习笔记(1)

hive一次使用命令: $ hive -e "select * from mytable limit 1;" OK name1 1 name2 2 Time taken: 3.935 seconds $ hive -e "select * from mytable limit 1;" > /tmp/myfile $ cat /tmp/myfile OK name1 1 name2 2 Time taken: 3.935 seconds 静默模式: $ hive

JavaScript面向对象编程指南——学习笔记1

第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对象的程序设计 1.5.1 对象(属性和方法的集合) 1.5.2 类 (相似对象的共同特征,如麻雀.老鹰都是鸟类) 1.5.3 封装 (将属性和方法集合起来,也有封闭作用域的概念,如封装一个播放器对象) 1.5.4 聚合 (将几个对象合并成一个对象) 1.5.5 继承 (一个实例对象继承父级对象的一些属性和方法) 1.5.6 多态 (一个对象调用其他对象的方法,call和apply) 1.6 OPP

Hive编程指南学习笔记(2)

我们可以使用describe extended financial.employee命令来查看这个表的详细表结构信息(如果当前所处的工作数据库就是financial,那可以不佳finanacial). 如果使用formatted替代关键字extended的话,那可以得到更多的输出信息. 如果用户只想查看某一列的信息,那么只要在表名后增加这个字段的名称即可.这种情况下,使用extended关键字也不会增加更多的输出信息: hive> describe financial.employee.sala