shell脚本精华总结

shell脚本精华总结
shell脚本精华总结

1.shell做解释程序,非交互地执行脚本,两种执行方式:

用sh命令执行脚本文件sh hello.sh

给脚本文件添加执行权限,用./命令执行chmod 755 hello.sh ./hello.sh 2.vim

(1)必须从命令模式转入插入模式才能进行输入编辑,可用命令有:

新增 (append)

a :从光标所在位置后面开始新增资料

A:从光标所在行最后面的地方开始新增资料。

插入 (insert)

i:从光标所在位置前面开始插入资料

I :从光标所在行的第一个非空白字元前面开始插入资料。

开始 (open)

o :在光标所在行下新增一列并进入输入模式 O: 在光标所在行上方新增一列并进入输入模式

(2)冒号进入行命令模式,输入set nu可设置vi显示行号

:/string 搜索指定的字符串。

按键n:继续进行搜索

如果写的是斜杠(/):按n会从当前位置向后查找;如果写的是问号(?),按n键则从当前位置向前查找

查找且替换

:%s /SEARCH /REPLACE 把文档中所有SEARCH替换成REPLACE;

:#,# s /SEARCH /REPLACE /g #号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;

:s /SEARCH /REPLACE /g 把当前光标所在行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示

例题:

1. mkdir /tmp/vitest

2. cd /tmp/vitest

3. cp /etc/man.config .

4. vi man.config

5. :set nu

6. 先按下 58G 再按下40→ 会看到 /dir/bin/foo 这个字样在双引号内;

7. 先执行 1G 或 gg 后,直接输入 /bzip2

8. 直接执行 :50,100s/man/MAN/gc 即可

9. (1)简单的方法可以一直按 u 恢复到原始状态,(2)使用不储存离开 :q! 之后,再重新读取一次该文件;

10. 51G 然后再 10yy 之后按下 G 到最后一行,再p粘贴10行

11. 11G 之后,再给他 20dd即可删除 20 行了;

12. :w man.test.config

13. 29G 之后,再给他 15x 即可删除 15 个字符;

14. :wq!

#!/bin/bash 必须的,指出shell的类型

例题:

#!/bin/bash shell类型

#a simple shell script example

#a function

funciton sayhello() 函数

{

echo "Enter Your name:"

read name 读取来自键盘输入的变量

echo "Hello $name"

}

echo "programme starts here..." 主过程

sayhello

echo "programme ends."

3.符号

注释符#

除了#!/bin/bash里的#特殊

变量符与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来

单引号

被引起的字符全部做普通字符,即全部原样echo ‘my $SHELL’

双引号引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。

倒引号(数字1键旁边的那个键)

引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。

反斜线

反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。

4.本地变量在用户现在的shell生命期的脚本中使用

变量名=值

注意:

(1)等号两边不可以有空格

(2)取值包含空格,必须用双引号括起来

(3)Shell变量可以用大小写字母,区分大小写

除变量unset 变量名

举例:echo ${name} unset name (注意:name前没有$)

设置变量时,不想再改变其值,可以将之设为只读变量

变量名=值

readonly 变量名

5.环境变量

用于所有用户进程(通常称为子进程)。登陆进程称为父进程,通过pstree可以查看

设置环境变量

variable-name=value

export variable-name(环境变量名大写)

显示环境变量:

(1)env 可以看到所有的环境变量

(2)echo $环境变量名(显示一个变量)

清除环境变量 unset 环境变量名

HOME :代表使用者的家目录。cd ~ 去到使用者的家目录或者利用 cd 就可以直接回到使用者家目录了。

PS1:shell的主提示符

SHELL :目前这个环境使用的 SHELL 是哪个程序?如果是 bash 的话,预设是 /bin/bash PWD:用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在什么位置。它是由Linux自动设置的

HISTSIZE :这个与“历史命令”有关,曾经下达过的指令可以被系统记录下来,而记录的“数目”则是由这个值来设定的。

ENV :这个使用者所使用的个性化环境设置文件的读取文件。 MAIL :当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件(mailbox)。

PATH :就是执行文件搜寻的路径,目录与目录中间以冒号(:)分隔,由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。

LANG :语系文件,很多数据都会用到他,当出现编码错误的时候往往需要设置它,中文编码是zh_CN.UTF8

6.Bash的初始化文件有:/etc/profile、~/.bash_profile、~/.bash_login、~/.profile、

~/.bashrc、/etc/bashrc

/etc/profile 存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell 时,该该文件被读取.

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

上述配置文件的作用

1)登录Linux先启动系统配置文件/etc/profile,并从/etc/profile.d目录的配置文件中搜集shell的设置,为系统的每个用户设置环境信息。

2)用户配置文件~/.bash_profile,每个用户专用于自己使用的shell信息,仅用户登录时执行一次!默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件。

3)~/.bashrc文件包含专用于用户bash shell的bash信息,登录及每次打开新的shell时都会执行。里面又会调用/etc/bashrc

在/home/user/.bash_profile中定义下句,会怎样?

alias la=‘ls –a|grep “\.*”’

答:user下次再登陆,其shell会自动建立一个别名命令la,功能为查看当前目录下名字以.开头的文件。

写在~/.bash_profile中,需重新登录才能有效。除非运行source .bash_profile使其立即有效。

写在~/.bashrc中,则打开新的终端中就有效

区别:bash_profile只在会话开始的时候读取一次,而bashrc则每次打开终端时都会读取

按照传统,定义的变量如PATH放到.bash_profile中,而像别名函数等放在.bashrc中,但是.bash_profile先于.bashrc读取内容,也可全放入.bashrc中

7.部分内部变量是:

$# ——传送给shell程序的位置参数的数量

$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)

$0——shell程序的名称

$*——调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数

$@ “参数1”“参数2”…形式保存的参数

$n 第n个参数

$$ 本程序的PID

$! 上一个命令的PID

8.条件判断命令test

test n1 -参数 n2(或–参数表达式)

真返回0,假返回1。

-lt 小于 -le 小于等于 -gt 大于 -ge 大于等于 -eq 等于 -ne 不等于

例题:

#!/bin/bash

if test $1 -gt 0

then

echo “$1 number is postive”

else then

echo “$1 number is nagitive”

fi

如:test -d “mydoc” 判断mydoc是否是目录

-f 存在且是普通文件

-d 存在且是目录

-s 存在且字节数大于0

-r 存在且可读

-w 存在且可写

-x 存在且可执行

例题:检测从命令行输入的文件是否存在:

#!/bin/bash

if [ $# -ne 1 ]

then

echo “usage -$0 file-name”

exit 1

fi

if [ -f $1 ]

then

echo “$1 file exist”

else

echo “sorry,$1 file does not exist”

fi

其他参数

-a 逻辑与

-o 逻辑或

9.seq命令:产生1-9的数字序列

比如 seq 1 4

expr命令:对表达式求值$ expr 2 – 1

$ expr 1 \* 3 使用*要加转义符

$ echo `expr 1 + 3`

[]直接求值命令:对被括起来的表达式求值

例题:

if分支

if [ $# -eq 0 ]

then

echo “输入了0个参数”

elif [ $# -lt 1 ]

then echo “输入了多个参数”

else echo “输入了1个参数”

fi

case

case “$#” in

0)echo “输入了0个参数”;;

1)echo “输入了1个参数”;;

*)echo “输入了多个参数”;;

esac

每个分支条件后必须以两个分号结尾

for 例子——输出100内10的倍数

for i in `seq 1 9`

do

echo `expr $i \* 10`

done

或写echo $(expr $i \* 10)

10.read 变量1 [变量2 …]

可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。

如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;

如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。例题:

read a b

for i in `seq $a $b`

do

echo `expr $i \* 10`

done

while例子——求1到100的和

i=1

sum=0

while [ $i –le 100 ]

do

sum=$[$sum+$i]

i=$[$i+1]

done

echo $sum

11重定向

1 stdout标准输出

2 stderr标准错误

输出重定向到文件file,终端上只能看到标准错误:#命令 >file

错误重定向到文件file ,终端上只能看到标准输出:#命令2>file

标准输出和标准错误都重定向到file,终端上看不到任何信息:#命令>file 2>&1

(等于#命令1>file 2>&1)

cp /etc/my.conf >/dev/null 2>&1

/dev/null 空设备

此句命令的结果是:

cp命令没有目标文件,应该输出错误。

2>&1表示错误重定向指向标准输出。

>/dev/null又使标准输出重定向到空,就是不要输出信息

即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。

$ cat < file > file 文件內容会被洗掉

$ cat file 此处会没有内容

stdout、stderr 的管道先准备好才会从 stdin读内容

> file 会先清空 file,然後才读进 < file ,但此时file已被清空,

因此再重定位读进file的为空

最后cat显示的file就成空了

例题:

编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?

#! /bin/sh -

fname=/bin/date

if (test –f “$fname”) then

echo “exist”

fi

编写一个名为greet的问候程序,它执行时能根据系统当前的时间向用户输出问候信息。设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。

#! /bin/sh -

hour=`date|cut –c 12-13` 将命令执行的结果赋给hour变量,所以用反向单引号

if test “$hour” –ge 0 –a “$hour” –le 11; then

echo “Good morning!”

elif test “$hour” –ge 12 –a “$hour” –le 17; then

echo “Good afternoon!”

else

echo “Good evening!”

fi

编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。

#! /bin/sh -

if test $# -ne 1 then

echo "Incorrect number of arguments"

echo "Usage: ifuser username"

else

user=$1

if who | grep –q $user ; then # who | grep $user不是表达式而是命令组合,所以不需要test语句测试;如果命令组合执行成功,即找到指定的用户名则返回码为0;否则为非0。grep 命令–q选项来禁止显示搜索到的信息

echo $1 "user is logged on."

exit 0 exit 0表示程序终止后返回0值

else

echo $1 "user is not logged on."

exit 1 exit 1表示程序终止后返回非0的值

fi

fi

编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。

#! /bin/sh -

clear

echo " -----------------MENU------------------"

echo

echo " 1.Find files modified in last 24 hours"

echo " 2.The free disk space"

echo " 3.Space consumed by this user"

echo " 4.Exit"

echo

echo -n " Select:"echo –n实现输入的选择数字不换行

read choice

case $choice in

1)find $HOME -mtime -1 -print;;显示/home目录下,最近24小时内所有修改过的文件,-1参数是数字“1”,表示一天

2)df;;检查磁盘空间

3)du -s $HOME;;显示/home目录下文件的大小,命令中的-s选项是为了仅显示总计

4)exit;;

*)echo "Invalid option"

esac

编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。

#! /bin/sh -

for file in *.txt

do leftname=`basename $file .txt` basename命令,该命令从随后的文件名剥去指定的后缀

mv $file $leftname.doc

done

在Linux系统中不支持mv *.txt *.doc这样的更名命令形式,如果需要将文件成批地更名最好编写一个shell脚本文件

编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。

#! /bin/sh –

if test $# -ne 1 如果没有从命令行输入用户名,则测试$# -ne 1为“真”,显示用法提示信息

then

echo “Usage: chuser username”

else user=”$1”

until who |grep “$user”>/dev/null 采用重定向到/dev/null空文件的目的是不显示查找到的用户其他信息

do sleep 300

done

echo “$user has logged on!”

fi

程序中until语句的expression(循环条件)是who|grep “$user”命令执行的返回码,如果没有找到指定的用户名,返回码为非0(为“假”),则用sleep命令暂停执行程序5分钟;找到后返回码为0(为“真”),则终止循环并显示该用户已经登录的信息

printnumber判断参数是否是数

#!/bin/bash

a=$(echo $1|bc 2>/dev/dull)

if [[ $a != $1 ]]; then

echo “$1参数不是数”

else

echo “$1参数是数”

12.bc计算器,进制转换命令

13.${变量名匹配模式}

截掉匹配子串后剩余字符串是结果

str1=${a%%.*} str2=${a##*.} #从左向右,%从右向左

搜索最长匹配符号写两次,最短匹配写1次

$ MYVAR=foodforthought.jpg

$echo ${MYVAR##*fo}rthought.jpg

$echo ${MYVAR#*fo}odforthought.jpg

$ MYFOO="chickensoup.tar.gz"

$echo ${MYFOO%%.*}chickensoup

$echo ${MYFOO%.*}chickensoup.tar

指定字符偏移和长度截出子串

$ EXCLAIM=cowabunga

$ echo ${EXCLAIM:0:3} cow

#从第一个字符开始,截3个字符

$ echo ${EXCLAIM:3:7} abunga

#从第四个字符开始,截7个字符

x=abcd ${#x} # 获取字串长度 4

expr index $x “b“# 获取子串所在偏移 2

expr index $x "a“ # 获取子串所在偏移 1

echo ${x:1} # 获取子串

替换

echo ${name//jx/tc}

https://www.360docs.net/doc/ac11461150.html,

例题:数组

遍历数组:

total=${#A[*]}

for ((i = 0; i < total; i++))

do

echo ${A[$i]}

done

14.元字符

. 匹配任何单个字符。

$ 匹配行结束符。^ 匹配一行的开始。

* 匹配0或多个正好在它之前的那个字符。

+ 匹配1或多个正好在它之前的那个字符。

? 匹配0或1个正好在它之前的那个字符。

\ {i\} \{i,j\} 匹配指定数目的字符。

\ 这是引用符,转义;

[ ] [c1-c2] 匹配括号中的任何一个字符。 [^c1-c2]

\< \> 匹配词(word)的开始(\<)和结束(\>)。

\( \) 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。

| 将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 将当前任务挂起,返回job_id

fg job_id 把后台作业放到前台执行

bg job_id 把作业放到后台执行

例题:自定义函数

function foo() # foo为函数名

{

local a=$1; # 局部变量

echo $a;

return 0; # 返回值

}

foo “cool!”# 函数调用

echo $?

自定义函数– 16进制转点分十进制

a()

{

local str=$1

echo -n $((16#${str:0:2}))

str=${str:2}

if [ "x$str" = "x" ]

then

echo; return

else

echo -n "."; a $str

fi

}

#Usage

a "DDB14CCF"

15.整数计算

id++ id-- ++id –id - + ! ~ ** * / % 计算

<< >> & ^ | 位操作

<= >= < > == != 比较

&& || 逻辑操作expr?expr:expr 三元操作符

= *= /= %= += -= <<= >>= &= ^= |= 赋值操作符

y=2000 闰年计算

echo $((y%4==0 && y%100!=0 || y%400==0))

(( y++ )) 自增1

tmp=$((16#a)) 进制转换

16.浮点运算

echo “scale=5; 3/7"|bc –l .42857

echo "100.43KB 20.12KB" | awk '{print $1- $2}' 80.31 echo "ibase=16;F"|bc -l 15

例题:

随机字符串生成

typeset -r DEFAULT_STR_LEN=5

typeset -ra dict=(a b c d e f g h i j k l m n o p q r s t u v w x y z)

function get_random_letter()

{

echo -n ${dict[$((RANDOM%${#dict[*]}))]}

return 0

}

function get_random_string()

{

local slen str

[ $# -eq 1 ] && slen=$1 || slen=$DEFAULT_STR_LEN

for ((i = 0; i < slen; i++))

do

str=${str}`get_random_letter`

done

echo $str

return 0

}

get_random_string $1

调试

-x

-n 是只语法检查而不执行任何命令

-e 是脚本发生第一个错误时就中止脚本运行,即当一个命令返回非零值时退出脚本 (除了until 或 while loops, if-tests, list constructs)

--posix 是更改Bash或脚本的行为,使之符合POSIX标准

Shell 伪信号:EXIT,ERR,DEBUG

17.常用工具

编辑软件: vi,emacs

联机帮助:man, info

查找类:find,locate,which,whereis,whatis

文本处理类:uniq,cut,paste,join,sort,comm,diff

二进制文件读取类:od,xxd,dd,hexdump

文本分析类:grep,sed,awk

系统状态类:top,ps,pstree,pgrep,/proc,strace,vmstat,netstat

传输类:wget

18.Grep - 全文匹配利器

--color 飘红匹配到的部分 -i 忽略大小写-v 反向匹配-r 递归匹配文件 -o 只打印匹配到的部分

-n 打印出行号-c 统计匹配到的行数-w 匹配整词

grep "sort“ *.doc

19.diff:按行比较两个文件的不同

常用选项

-b 忽略两行行尾空格,以及空格个数的区别-E 忽略tab和空格间的区别-w 完全忽略所有空格类字符-B 忽略空行-I 忽略大小写--normal以normal形式输出不同行。即指输出不同的行

-c 以context形式输出不同行。包含不同行的上

cmp:按字节比较两个文件的不同

diff3:按行比较三个文件的不同

sdiff:输出两个文件的合集。输出文件中两个文件原本的行在同一行中不同列

comm:快速的比较两个已经排过序的文件,输出两个文件的合集,交集,或任何单独的部分20.find,locate

功能:查找文件。find将在目录树中查找和用户指定模式相符合的文件。locate则是通过在locate的数据库中查找,locate 的数据库由updatedb程序负责维护。

常用选项:

-name:指定要查找的文件名-perm:指定要查找文件的权限-size:指定要查找文件的大小范围-mtime:指定查找修改时间在n天以内的文件。

使用举例:

find . -mtime –1:查找在最近一天内被修改的文件

find . -name b.cpp -exec mv \{\} a.cpp \;

21.sort

功能:对文件中的各行进行排序。

sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。缺省情况下以整行为关键字按ASCII字符顺序进行排序。

常用选项

- m 若给定文件已排好序,合并文件。- c 检查给定文件是否已排好序。

- u 对排序后认为相同的行只留其中一行。- d 按字典顺序排序,仅比较字母、数字、空格和制表符。- r 按逆序输出排序结果。- b 在每行中寻找排序关键字时忽略前导的空格和制表符。

- t separator 指定字符separator作为字段分隔符。-k,pos1,[pos2]:以pos1到pos2中间的字符为键值

使用举例

cat words | uniq –c | sort –k 1,1 –n –r 将一批词按照出现频次有高到低排序

uniq,join,cut,paste

22.cut功能:用来从标准输入或文本中剪切指定列或者域

常用选项:

-c:指定剪切字符数-f:field 指定剪切指定域数-d:delimit 指定除空格和tab外的域分隔符使用举例:

cut –d : -f 3 example.txt

who –u|cut –c1-8

23.paste功能:将两个文件按行粘贴在不同的列中。是cut的反向操作。

24.dd拷贝二进制文件

格式:

count=BLOCKS 只拷贝BLOCKS个数据块

ibs=BYTES 一次读入的数据量

if=FILE 输入文件

obs=BYTES 一次写出的数据量

of=FILE 输出文件

seek=BLOCKS 输出文件跳过BLOCKS个数据块

skip=BLOCKS 输入文件跳过BLOCKS个数据块

time dd if=/dev/zero of=test bs=1024k count=1024 查看系统io性能

25.wget

功能:支持使用FTP和HTTP协议,从其他主机上下载所需要的文件

常用选项:

-r:递归的下载目录以及它的子目录和所有文件

-nH:不创建以目标主机域名为目录名的目录,将目标主机的目录结构直接下到当前目录下

--cut-dir=[number]不在本地机器上建立的目录层数

-m --mirror自动开启适合用来镜像站点的选项

-A, --accept=LIST允许下载的文件类型列表

-R --reject=LIST拒绝继续下载的文件类型列表

-D, --domains=LIST允许继续扩展的站点列表

--tries=[number]自动重连的次数 -c:断点续传

--debug:使用这个选项可以看到更多wget下载文件过程中的调试信息,比如下载一个http文件时所发送和接收的http包头的格式

--timeout=SECONDS控制wget读超时时间,缺省为900秒

Wget –nH –cut-dir=1 ftp://*:*@https://www.360docs.net/doc/ac11461150.html,/

wget “https://www.360docs.net/doc/ac11461150.html,”

Shell 经典实例

Thizlinux 系统教程 Shell 经典实例 ----------------Milo 经典小shell 1 列目录树的shell 脚本如下: #!/bin/sh # dtree: Usage: dtree [any directory] dir=${1:-.} (cd $dir; pwd) find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g" 2 while中使用read (file是一个文件) cat file | while read line do echo $line echo " :: Please input any key(s):c" str4read="" while true do chr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null` str4read=$str4read$chr4read if [ "$chr4read" = "" ] ;then break; fi

done echo " :: |$str4read|" done 3 将多个空格替换为字符 sed 's/[ ][ ]*/ /g' 如果空格与tab共存时用 sed -e 's/[[:space:]][[:space:]]*/ /g' filename 4用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi

linux脚本实例

1.写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。 #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 2.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。 #!/bin/sh case ${1##*.tar.} in bz2) tar jxvf $1 ;; gz) tar zxvf $1 ;; *) echo "wrong file type" esac 3.写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。 #!/bin/sh RPM=/bin/rpm option="-q" while true do echo "what to query?" select var in "All" "file" "package name" do case $var in All) option=$option"a" break ;; file) echo -n "please input file name: "

经典shell 脚本实例

Linux shell 脚本实例 1. 写一个脚本,利用循环计算10的阶乘#!/bin/sh factorial=1 for a in `seq 1 10` do factorial=`expr $factorial \* $a` done echo "10! = $factorial" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done ////////////////////////////////////////// #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 3. 写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和 4.一个函数,利用shift计算所有参数乘积,假设参数均为整数 #! /bin/sh result=1 while [ $# -gt 0 ] do result=`expr $result * $1` shift done echo $result 5.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。#!/bin/shcase ${1##*.tar.} in bz2) tar jxvf $1 ;; gz) tar zxvf $1 ;; *) echo "wrong file type"esac6.写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。

Shell脚本编程详解-吐血共享

第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。

12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day !

Shell脚本及linux命令学习

Shell脚本及linux命令学习 ?echo "内容" |mail -s "标题" "收件人" mail [邮箱] <

Shell脚本-Demo-29例

【例子:001】判断输入为数字,字符或其他 1.#!/bin/bash 2.read -p "Enter a number or string here:" input 3.case $input in 4. [0-9]) echo -e "Good job, Your input is a numberic! \n" ;; 5.[a-zA-Z]) echo -e "Good job, Your input is a character! \n" ;; 6. *) echo -e "Your input is wrong, input again! \n" ;; 7.esac 【例子:002】求平均数 1.#!/bin/bash 2.# Calculate the average of a series of numbers. 3.SCORE="0" 4.AVERAGE="0" 5.SUM="0" 6.NUM="0" 7.while true; do 8. echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE; 9. if (("$SCORE" < "0")) || (("$SCORE" > "100")); then 10. echo "Be serious. Common, try again: " 11. elif [ "$SCORE" == "q" ]; then 12. echo "Average rating: $AVERAGE%." 13. break 14. else 15. SUM=$[$SUM + $SCORE] 16. NUM=$[$NUM + 1] 17. AVERAGE=$[$SUM / $NUM] 18. fi 19.done 20.echo "Exiting." 【例子:003】自减输出 1.[scriptname: doit.sh] 2.while (( $# > 0 )) 3.do 4. echo $* 5. shift 6.done 7./> ./doit.sh a b c d e 8. a b c d e 9. b c d e 10.c d e

LinuxShell脚本编程实例

#! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done #!/bin/bash # menu shell script. samli 2004.4.19 until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file ;; 4) echo "enter file name:" read file rm $file ;; 5) echo "Goodbye"

个人整理shell脚本编程笔记

shell脚本编程学习笔记(一) 一、脚本格式 vim shell.sh #!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释 #Program://程序内容说明 #History://时间和作者 二、shell变量的种类 用户自定义变量:由用户自己定义、修改和使用 与定义变量:Bash与定义的特殊变量,不能直接修改 位置变量:通过命令行给程序传递执行的参数 1、定义变量: 变量名要以英文字母或下划线开头,区分大小写。 格式:变量名=值 输出变量:echo $变量名 2、键盘输入为变量内容: 格式:read [-p "信息"] 变量名 如:read -p "pewase input your name:" name 3、不同引号对变量的作用 双引号"":可解析变量,$符号为变量前缀。 单引号'':不解析变量,$为普通字符。 反引号``:将命令执行的结果输出给变量。 三、shell条件测试 1、test命令: 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。 格式:test 条件表达式[ 条件表达式] (注意:[]与表达式之间存在空格) 2、常见的测试类型: 测试文件状态 格式:[ 操作符文件或目录] 如:if [ -d /etc ] then echo "exists" else echo "not exists" fi 常见的测试操作符: -d:测试是否为目录 -e:测试目录或文件是否存在 -f:测试是否为文件 -r:测试当前用户是否有读权限 -w:测试当前用户是否有写权限 -x:测试当前用户是否有执行权限

Shell脚本例子集合

# vi xx.sh 退出并保存 # chmod +x xx.sh # ./xx.sh -2.调试脚本的方法 # bash -x xx.sh就可以调试了. -1.配置secureCRT的设置(我用的是6.2.3 build313版本,汉化版) 选项->会话选项(S)...->终端->仿真->终端(T)->把VT100改成Xterm->点中ANSI 颜色(A)和使用颜色方案(U)复选框. 这样就有颜色显示了. 选项->会话选项(S)...->终端->外观->字符编码(H)->从Default变到UTF-8. 这样就有中文显示了. 1.写一个脚本,执行后,打印一行提示"Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值.直到用户输入"end"停止. # vi show_var.sh 脚本内容: #!/bin/bash unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 命令保存后退出,并执行: # chmod +x show_var.sh # ./show_var.sh please input a number: 1 var is 1 please input a number: s var is s please input a number: end # 2.写一个脚本,测试位置参数

如何做才能学好Shell脚本的经验总结

如何做才能学好Shell脚本的经验总结 大多同学反馈Shell脚本不容易学,感觉学完了Shell脚本这部分课程,还是不能写出脚本来。我来帮大家分析一下原因,并解说如何做才能学好Shell脚本。 之所以你觉得难学,写不出东西来。是因为,太生疏。写Shell脚本其实跟婴儿学走步,学骑自行车或者学游泳一样,这是一个熟练活儿。 要想写出一手漂亮的脚本,我总结了以下几点: 1 打好基本功 Shell脚本,本质上是多条Linux系统命令加上逻辑(条件、循环)构成的一个文本文档。要想实现一个需求,只要你可以用系统命令实现,那Shell脚本就可以实现。如果你Linux 命令都不会,那怎么能写出脚本来? 2 学好正则 如果你多写几个Shell脚本,就会发现,好多需求是从一个大字符串里截取出小字符串。这就需要你对正则表达式十分熟练,操作正则的几个工具也要熟练使用(grep/sed/awk)。 3 逻辑思维能力 大型的Shell脚本中,有很强的逻辑,条件满足时做什么,不满足时做什么。条件里面还可以嵌套条件,也可以嵌套循环(for、while等)。 这种逻辑能力并不是我们生来具备的,它是需要不断练习、长期积累出来的功力。 你可能会问,哪里有那么多的脚本需求?关键是没有机会练习啊。是的,这的确是个问题,尤其是正在学习阶段的同学,平时哪里有什么需求啊。要是上班了还好,每天有很多工作做,生产环境中也有不少需求用Shell脚本来实现。 对于学习阶段的同学,我考虑到你们的处境,所以去年花了几个月时间,在公众号里坚持每日发一个Shell练习题,这些资源你可以利用起来。其实,有不少同学只坚持了一个月就已经感觉到了明显的提升。

LinuxShell脚本编程实例

1、打印位置变量的个数和位置变量的内容 #! /bin/sh echo "Current command is $0" echo "The first parameter is $1" echo "The second parameter is $2" echo "The third parameter is $3" echo "Total of parameters if $#" echo "Current PID is $$" 2、循环打印“I love linux”3次 #!/bin/bash times=0 until [ "$times" = 3 ]; do echo "I love linux." sleep 2 times=`expr $times + 1` done 3、完成菜单程序的功能: 1)列出当前的文件 2)更改路径 3)编辑文件 4)删除文件 #!/bin/bash # menu shell script. until echo "List Directory..........1" echo "Change Directory........2" echo "Edit File...............3" echo "Remove File.............4" echo "Exit Menu...............5" read choice test $choice = 5 do case $choice in 1) ls;; 2) echo "enter target directory:" read dir cd $dir ;; 3) echo "enter file name:" read file vi $file

shell脚本精华总结

1.shell做解释程序,非交互地执行脚本,两种执行方式: 用sh命令执行脚本文件sh hello.sh 给脚本文件添加执行权限,用./命令执行chmod 755 hello.sh ./hello.sh 2.vim (1)必须从命令模式转入插入模式才能进行输入编辑,可用命令有: 新增 (append) a :从光标所在位置后面开始新增资料 A:从光标所在行最后面的地方开始新增资料。 插入 (insert) i:从光标所在位置前面开始插入资料 I :从光标所在行的第一个非空白字元前面开始插入资料。 开始 (open) o :在光标所在行下新增一列并进入输入模式 O: 在光标所在行上方新增一列并进入输入模式 (2)冒号进入行命令模式,输入set nu可设置vi显示行号 :/string 搜索指定的字符串。 按键n:继续进行搜索 如果写的是斜杠(/):按n会从当前位置向后查找;如果写的是问号(?),按n键则从当前位置向前查找 查找且替换 :%s /SEARCH /REPLACE 把文档中所有SEARCH替换成REPLACE; :#,# s /SEARCH /REPLACE /g #号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE; :s /SEARCH /REPLACE /g 把当前光标所在行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示 例题: 1. mkdir /tmp/vitest 2. cd /tmp/vitest 3. cp /etc/man.config . 4. vi man.config 5. :set nu 6. 先按下 58G 再按下40→ 会看到 /dir/bin/foo 这个字样在双引号内; 7. 先执行 1G 或 gg 后,直接输入 /bzip2 8. 直接执行 :50,100s/man/MAN/gc 即可 9. (1)简单的方法可以一直按 u 恢复到原始状态,(2)使用不储存离开 :q! 之后,再重新读取一次该文件; 10. 51G 然后再 10yy 之后按下 G 到最后一行,再p粘贴10行 11. 11G 之后,再给他 20dd即可删除 20 行了; 12. :w man.test.config 13. 29G 之后,再给他 15x 即可删除 15 个字符; 14. :wq! #!/bin/bash 必须的,指出shell的类型

linux下简单shell脚本例子

一些自己练习时所写的简单shell脚本 (centos 6.3)【复制粘贴时请注意空格、引号、分号等格式】1、使用for循环、while循环、until循环计算100以内所有偶数的和 for循环: #!/bin/sh Sum=0 for i in `seq 0 2 100` #也可用for i in $(seq 0 2 100) #或者for (( i=0;i<=100;i+=2 )) do let “Sum+=i” done echo “SUM=$Sum” exit 0 while循环: #!/bin/sh Sum=0 i=0 while [ “$i”–le 100 ] do let “Sum+=i” let “i+=2” done echo “SUM=$Sum” exit 0 until循环: #!/bin/sh Sum=0 i=0 until [ “$i”–gt 100 ] do let “Sum+=i” let “i+=2” done echo “SUM=$Sum” exit 0 2、通过循环实现从1开始叠加,直到和的结果大于2000为止(使用break循环控制符) #!/bin/sh Sum=0 for (( i=1;;i++) do let “Sum+=i” if [ “$Sum”–gt 2000 ] then echo “i=$i” echo “SUM=$Sum” break

done exit 0 3、找出100以内所有能被3整除的数,每行显示8个数,然后换行显示#!/bin/sh times=0 #循环次数 for i in $(seq 1 100) do let “temp=i%3” let “times++” if [ “$temp”–eq 0 ] then printf “$i” let “a=times%8” if [ “$a”–eq 0 ] then printf “\n” fi fi done printf “\n” exit 0 4、打印九九乘法表 #!/bin/sh for (( i=1;i<=9;i++) do for (( j=1;j<=i;j++ )) do let “temp=i*j” echo –n “$j*$i=$temp “ done echo “” done exit 0 5、显示颜色类型,并让用户选择(使用select结构) #!/bin/sh echo “What is your favorite color?” select color in “red”“blue”“green”“white”“black” do break done echo “You have selected $color.” exit 0 6、显示当前工作目录下的文件数和目录数 #!/bin/sh Number() { let “dir_number=0” let “file_number=0”

Shell脚本抽取实例

Shell脚本抽取实例 #!/usr/bin/ksh 1. 应用地址变量引用 myself="backup_chncm_file.sh" logfile="${MCB_HOME}/${MCB_APPID}/var/log/${procname}.log" 2. case实例 case ${MCB_APPID} in chs) ic_dir="/opt/mcb/chs/data/*/inroam/incoming" arch_dir="/opt/mcb/chs/back" file_pattern="[AC][CD]?????CHNCM*" db_user="chsdba" ;; ops) ic_dir="/opt/mcb/ops/data/incoming/ics" arch_dir="/opt/mcb/ops/arch/incoming/ics" file_pattern="[AC][CD]?????CHNCM*" db_user="iogsmdba" ;; *) MCB_APPID=dps1 echo "MCB_APPID is not in chs/ops, please check!" exit 1 ;; esac 3. 判断参数个数实例 if [ $# -lt 1 ];then echo "SERIOUS:DBMSG() need 1 argument: DEBUGMSG" return 1 fi 4. 判断结果实例 if [ $? -ne 0 ];then message="query carriers table failed! db_user=${db_user} db_passwd=${db_passwd} db_sid=int1"

shell的十个例子

1、用shell脚本批量建立Linux用户 实现要求:创建用户student1到student50,指定组为student组!而且每个用户需要设定一个不同的密码! 脚本实现如下: #!/bin/bash for i in `seq 1 50` do useradd -G student student$i ; echo student$i | passwd student$i --stdin; done 【说明:Linux下Passwd有参数 --stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe. 所以linux下自动改变用户密码的办法就是: Echo 密码|passwd –stdin 用户名 】 -------------------设置相同的密码------------------------ #!/bin/bash password="123456" for USER in user1 user2 user3 do useradd -m $USER echo -e "${password}\n${password}" | passwd $USER done 【说明: echo -n 不换行输出:

$echo -n "123" $echo "456" 最终输出 123456 而不是 123 456 echo -e 处理特殊字符: \n 换行且光标移至行首】 ok,就这么一个简单的脚本,就可以再系统里批量生成账号了。而且密码跟账号的名字一样。 这就是for do done语句用法。 2、编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp 目录下: #!/bin/bash for FILE in `ls /usr/local/test` do if [ -f $FILE ] ; then if [ `ls -l $FILE | awk `{print $5}` -gt 100000 ] ; then mv $FILE /tmp/ fi fi done ================ #!/bin/bash for FileName in `ls -l /usr/local/test | awk '$5>102400' {print $9}`

Shell脚本学习指南笔记

入门 Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型、特定的工作。 脚本编程语言与编译型语言的差异 许多中、大型程序都是编译型语言,如Fortran、Ada、C、C++或者Java(有些特殊)。这类程序只要从源代码(Source Code)转换成目标代码(Object Code)便能直接通过计算机执行。这样的好处是高效,缺点是它们多半运行于底层,处理的是字节、数字或是机器层级的对象,很难进行“将一个目录里所有文件复制到另一个目录中”这类对文件的简单操作。 脚本语言通常是解释型(interpreted)的,由解释器(interpreter)读入程序代码,将其转换成内部形式。好处是它们多半运行在比编译型语言高的层次,能够轻易处理文件与目录之类的对象,缺点是效率不如编译型。但是编写更快,而且目前的速度也已经足够快,常用脚本语言有:awk、Perl、Python、Ruby与Shell。Shell的特点有: 1.简单性 2.可移植性 3.开发容易 一个简单的脚本 who命令可以知道系统有谁登陆,如果有很多用户在登陆,结果会很长,可以使用wc(字数统计)命令,算出行数(line)、字数(word)和字符数(character)。可以使用wc –l,只计算出行数$ who | wc –l | 管道符号可以在两个命令之间建立管道(pipeline):who的输出成为了wc的输入。下面就写一个shell脚本将管道转变成一个独立的命令。 其实在Shell中开发周期很类似,先直接在命令行上测试,之后写入到独立的脚本中。 第一行的#! 当Shell执行一个程序时,要求Unix内核启动一个新的进程(process),在该进程里执行指定的程序。内核知道怎样为编译型程序执行,但Shell是解释型程序,当Shell要求内核执行时,内核无法执行,会回应”not executable format file”不是可执行的格式文件的错误信息。Shell收到此错误信息时,就会确定不是编译型程序,是Shell脚本,接着会启动一个新的/bin/sh副本来执行该程序。 在当前有很多种Shell,需要通过第一行#!来指定用哪个Shell来执行。一般如下: #! 解释器地址选项 比如标准的Shell脚本: #! /bin/sh

linux Shell(脚本)编程入门 实例讲解详解

linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

Shell 脚本基础学习笔记

Shell 脚本基础学习笔记 shell脚本的解释用“#”号,本文档为了习惯方便,解释大都用“//”,也有用“#”的SHELL 最基本的语法

基本元字符集及其含义(2008-05-24) abc 表示abc 三個連續的字符, 但彼此獨立而非集合. (可簡單視為三個char set) (abc) 表示abc 這三個連續字符的集合. (可簡單視為一個char set) a|b 表示單一字符, 或a 或b . (abc|xyz) 表示或abc 或xyz 這兩個char. set 之一. (註二) [abc] 表示單一字符, 可為a 或b 或c . (與wildcard 之[abc] 原理相同) [^abc] 表示單一字符, 不為a 或b 或c 即可. (與wildcard 之[!abc] 原理相同) ^ 只匹配行首 $ 只匹配行尾 * 只一个单字符后紧跟*,匹配0个或多个此单字符 [ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[ ]内字符序列范围,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ] \ 只用来屏蔽一个元字符的特殊含义。因为有时在s h e l l中一些元字符有特殊含义。\可以使其失去应有意义 . 只匹配任意单字符 p a t t e r n \ { n \ } 只用来匹配前面p a t t e r n出现次数。n为次数 p a t t e r n \ { n,\ }含义同上,但次数最少为n p a t t e r n \ { n,m \ }含义同上,但p a t t e r n出现次数在n与m之间 现在详细讲解其中特殊含义 1、使用句点匹配单字符 例一:beg.n:以beg开头,中间夹一个任意字符。 例二:. . . .X C. . . .:共10个字符,前四个之后为XC 例三:列出所有用户都有写权限的目录或文件: ls -l |grep ...x..x..x 2、行首以^匹配字符串或字符序列 ^只允许在一行的开始匹配字符或单词。 例如,使用ls -l命令,并匹配目录。 $ ls -l | grep ^d 3、在行尾以$匹配字符串或字符 可以说$与^正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。 例一:列出文件httpd1.conf中所有以单词common结尾的行 $grep common$ httpd1.conf

shell脚本实例

shell脚本实例 1. 写一个脚本,利用循环计算10的阶乘 #!/bin/sh factorial=1 for a in `seq 1 10` do factorial=`expr $factorial \* $a` done echo "10! = $factorial" 注:上面有一行,for a in `seq 1 10`,其中seq 1 10 , 即列出现1到10之间所有的数字,这一行也可改为:for a in "1 2 3 4 5 6 7 8 9 10" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然 后打印出该数值,然后再次要求用户输入数值。直到用户输入 "end"停止。 #!/bin/sh

while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 3. 写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和#!/bin/sh sum=0 for a in `seq 1 100` do if [ `expr $a % 3` -ne 0 ] then continue

echo $a sum=`expr $sum + $a` done echo "sum = $sum" 4.一个函数,利用shift计算所有参数乘积,假设参数均为整数( 特殊变量$# 表示包含参数的个数) #! /bin/sh result=1 while [ $# -gt 0 ] do result=`expr $result \* $1` shift done echo $result 5.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。 #!/bin/sh

最全面实用的Linux Shell脚本编程知识点总结

(这些往往是经常用到,但是各种网络上的材料都语焉不详的东西,个人认为比较有用)七种文件类型 d 目录l 符号链接 s 套接字文件 b 块设备文件 c 字符设备文件p 命名管道文件 - 普通文件 正则表达式 从一个文件或命令输出中抽取或过滤文本时。可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。 基本的元字符集: ^ 只匹配行首。 $ 只匹配行尾。 * 一个单字符后紧跟*,匹配0个或多个此单字符。 [] 匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用-来表示[]内范围,如[1-5]等价于[1,2,3,4,5]。 \ 屏蔽一个元字符的特殊含义,如\$表示字符$,而不表示匹配行 尾。

. 匹配任意单字符。 pattern\{n\} 匹配pattern出现的次数n pattern\{n,\}m匹配pattern出现的次数,但表示次数最少为n pattern\{n,m\} 匹配pattern出现的次数在n与m之间(n,m为0-255)几个常见的例子: 显示可执行的文件:ls –l | grep …x...x..x 只显示文件夹:ls –l | grep ^d 匹配所有的空行:^$ 匹配所有的单词:[A-Z a-z]* 匹配任一非字母型字符:[^A-Z a-z] 包含八个字符的行:^……..$(8个.) 字符类描述 以下是可用字符类的相当完整的列表: [:alnum:] 字母数字[a-z A-Z 0-9] [:alpha:] 字母[a-z A-Z] [:blank:] 空格或制表键 [:cntrl:] 任何控制字符 [:digit:] 数字[0-9]

shell脚本学习与总结

shell脚本学习与总结 1.shell 脚本是区分小写的 2.Unix特殊字符有:( ; $ ? & * () [] ` ‘ “ +使用其时要进行转义() 3.Shell的注释以#开头 4.函数的定义 Function fuction_name(){ Command to execute } 调用时直接用function_name. 5.控制结构 1)If...then语句 If [ test_command ] Then Commands if 2)If...then...else语句 If [ test_command ] Then Commands Else

commands if 3)If...then...elif...then...(else)语句If [ test_command ] Then Commands Elif [ test_command ] Then Commands Else Commands Fi 4)for ... In语句 For loop_varible in argument_list Do Commands done 5)while语句 While test_command_is_true Do Commands Done

6)until 语句 Until test_command_is_true Do Commands Done 7)case语句 Case $variable in Match_1) Commands_for_1Match_2) Commands_for_2. . . *) #option for other values Commands_for_no_matchesac 6.break、continue、exit和return语句 Break跳出整个循环体,然后执行循环体外接下来的代码;Continue 结束本次循环,继续下次循环; Exit 退出整个脚本,一般在其后加入一个整数(如exit 0),作为返回代码发送给系统; Return 用于在函数中返回数据,或返回一个结果给调用函数 7.here文档

相关文档
最新文档