shell脚本编程

来源:互联网 发布:南风知我意2朱旧番外 编辑:程序博客网 时间:2024/06/07 15:22

shell脚本介绍

1.为什么使用Shell脚本

批量命令
重复、条件等控制

2.Shell脚本的基本内容

第一行:#!/bin/sh
第二行:注释:#
第三行:变量
第四行:条件判断、循环

3.脚本的运行方式

chmod +x 脚本
./脚本文件名

4.示例(hello.sh)

#!/bin/bash       //第一行#这是一个基本的shell脚本        //注释op="hello world"               //变量echo $op                      //打印变量

shell特性

1.别名(alias)

e.g. alias ll='ls -alh'

2.命令替换

3.管道(|)

把一个命令的输出连接到另一个命令的输入。

ls | sortcat func.txt | grep -v ^#

4.重定向(<>)

与管道相关,可以改变程序运行的输入来源和输出地点
Linux shell下常用输入输出操作符是:
1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ; /dev/stdin -> /proc/self/fd/0 0代表:/dev/stdin
2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ; /dev/stdout -> /proc/self/fd/1 1代表:/dev/stdout
3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; /dev/stderr -> /proc/self/fd/2 2代表:/dev/stderr
输出重定向:
格式:
command-line1 [1-n] > file或文件操作符或设备
上面命令意思是:将一条命令执行结果(标准输出,或者错误输出,本来都要打印到屏幕上面的) 重定向其它输出设备(文件,打开文件操作符,或打印机等等)1,2分别是标准输出,错误输出。

1. command > filename把标准输出重定向到一个新文件中2. command >> filename把标准输出重定向到一个文件中(追加)3. command 1  > filename把标准输出重定向到一个文件中4. command  > filename2 > &1把标准输出和标准错误一起重定向到一个文件中5. command2  > filename把标准错误重定向到一个文件中6. command2  >>  filename把标准输出重定向到一个文件中(追加)7. Command  >> filename 2 > &1把标准输出和标准错误一起重定向到一个文件中(追加)8. Command < filename > filename 2command命令以filename文件作为标准输入,以filename 2文件作为标准输出9. Command   << delimiter从标准输入中读入,直至遇到delimiter分界符10. Command  < &m把文件描述符m作为标准输入11. Command  > &m把标准输出重定向到文件描述符m中12. Command2  < &-关闭标准输入
例1:将myfle1作为sort的输入,并输出到屏幕。      $ sort<myflle1例2:将date的输出转向到myfile2文件中。      $ date>myfile2例3:将ls-l的输出追加到myfile3文件中。      $  ls -l>> myfile3例4:将myprogram错误输出改向到err_file文件。      $  myprogram 2 >err_file重定向标准输出示例:cat file | sort 1 > sort.out第3种情况cat file | sort > sort.out第1种情况pwd >> path.out第2种情况> nullfile.txt                创建一个文件重定向标准输入示例:sort < file                        将file文件中的数据作为输入,sort对其进行排序,然后将排序后的结果输出到屏幕上sort  <  name.txt  >  name.out第8种情况,对排序后的内容输出到name.out文件中标准输入示例:第9种情况[root@jack shell]# cat  >> term.txt  << SITECH>Hello,there I am using a $TERM !>and my username is $LOGNAME>bye…>SITECH[root@jack shell]# cat term.txtHello,there I am using a vt100 !and my username is rootbye…重定向标准错误示例:[root@jack shell]# grep “trd” book.txtGrep: missiles:No such file or directory[root@jack shell]# grep “trd” book.txt 2>  /dev/null解释:表示把错误信息扔给/dev/null , /dev/null 不会保存错误信息,实质就是丢失错误信息。如果sky.txt不存在,则错误信息存入到一个指定的文件中,如:ls -al sky.txt 2 > err_message.txt结合使用标准输出与标准错误示例:[root@jack shell]# cat account_new.txt \Account_old.txt 1> accounts.out 2> accounts.err[root@jack shell]# cat accounts.out???[root@jack shell]# cat accounts.err将2个文件的内容重定向到accounts.out中,如果某一个文件不存在,或出错,则将错误信息重定向到错误文件中accounts.err合并标准输出与标准错误示例:合并的时候shell是从左到右分析相应命令grep “standard” standard.txt > grep.out 2>&1->如果文件不存在,则把错误信息记录到grep.out中->如果文件存在,    也把正确的信息记录到grep.out中

5.后台处理

显示以txt为扩展名的文件或显示以a开头的文件,这种情况称为模式匹配。
实现方式:正则表达式

ls *.txt

6.模式匹配

7.变量

变量用来存储信息

示例:#!/bin/bash#这是一个基本的shell脚本printchar = “hello world”//定义变量echo $printchar

8.特殊字符

分号(;):允许在一行上放多个命令。eg: cd ~/backup ; mkdir startup ; cp ~/.* startup/.&:命令后执行。括号():创建成组的命令。竖杆(|):管道标示符。< > &:表示重定向。* ? [ ] !:表示模式匹配。$:变量名的开头。#:表示注释(第一行除外)。空格,制表符,换行符:当做空白。$((...)) :对括号内的表达式求值eg:         #!/bin/sh   x=0   while [ "$x" -ne 10 ]; do   echo $x          x=$(($x+1))          done          exit 0**: 两个星号在运算时代表 "次方" 的意思  eg: "sus=2**3"         echo "sus = $sus"         $ sus = 8{} 大括号:用法一:通配符扩展       eg: ls my_{finger,toe}s       这条命令相当于如下命令的组合:       ls my_fingers my_toes       eg: mkdir {userA,userB,userC}-{home,bin,data}用法二:可用于语句块的构造。'string' 单引号 和 "string" 双引号双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符 eg: $ heyyou=home     $ echo '$heyyou'     $ $heyyou    ($没有转义) eg: $ heyyou=home     $ echo "$heyyou"     $ home            ($转义了输出了heyyou变量的值)单引号:由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如:双引号:由双引号括起来的字符,除$, \, '和"这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。双引号(“):用来使shell无法认出空格、制表符和其他大多数特殊字符,这样“David Medinets”表示一个值。让 $   反斜杠  反引号 不失效单引号(‘):用来使shell无法认出所有特殊字符。反引号(`):用来替换命令。反斜杠(\):用来使shell无法认出以上的特殊字符,使其后的特殊字符失去特殊含义。如:David\ Medinets[root@sky /root]# touch David\ Medinets[root@sky /root]# ls David\ medinets放在指令前,有取消 aliases(别名) 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)

shell输入输出

1.echo

2.read

3.cat

4.管道

5.tee

shell控制结构

if then else语句

语法格式:

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

case语句

语法格式:

case 值 in 模式1)命令1…;;模式2)命令2…;;esac

注:可使用模式匹配

for循环

语法格式:

for 变量名 in 列表do命令1命令2……done

until循环

语法:

until 条件命令1命令2…done

注:条件发生在循环末尾,至少执行一次循环

while循环

语法:

while 条件do命令1命令2……done

FAQ

1.if [ "$#" -eq 0 ] ; then 是神马意思

$#表示位置参数的数目(对脚本来说,是运行脚本时所带的参数;对函数来说,是函数调用时传入的参数)。
数值的比较用 -eq ,字符串的比较才用 =

0 0
原创粉丝点击