知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > linux

SHELL编程入门

发布时间:2014-09-05 14:38:06作者:知识屋

SHELL编程入门
 
ØShell基础
Ø流程控制语法
Ø常用命令介绍
Ø样例展示
Ø技巧总结
 
}解决界面无法处理的问题
}
}命令行界面比较快
}
做好管理
 
}bsh (Bourne Shell)
}ksh (Korn Shell)
}csh ( C Shell)
}最常用的Shell是sh,大部分的Unix系统都将sh连接到bsh;IBM将sh连接到ksh
 
}Shell程序也就是一系列的Unix命令的组合,相当于DOS系统下的批处理命令。Unix命令既可以是内部命令,也可以是已经编译好的高级语言程序,甚至可以是其它Shell程序
}Shell程序支持分支与循环结构,可以进行信号处理
}Shell程序可以加注释,注释以“#”号开头,到行尾结束
 
}怎样才能知道用什么Shell来执行我编写的Shell脚本?参照下面三个原则:
◦如果脚本文件的第一个字符不是“#”号,则启动bsh执行此脚本
◦如果脚本文件的第一个字符是“#”号,但第二个字符不是“!”,则启动csh执行此脚本
◦如果脚本文件的前两个字符为“#!”,则后面必须是Shell的全路径,启动指定的Shell执行此脚本,如:
  #!/usr/bin/ksh
 
}Shell中if语句的语法如下:
}if 命令1      #如果命令1执行成功(返回0)
}then  #则执行list1命令列表
}    list1  #如果执行不成功(返回非0值)
}elif 命令2  #执行命令2
}then  #如果命令2执行成功
}    list2  #则执行list2命令列表
}else  #如果命令2执行不成功
}    list3  #则执行list3命令列表
}fi
}if语句以fi结尾
 
}Shell中case语句的语法如下:
}case word in    #如果word与 pattern1匹配,
}      pattern1)  #则执行list1命令列表
}          list1    #如果word与 pattern2匹配,
}          ;;  #则执行list2命令列表
}      pattern2)  #…………
}          list2
}          ;;
}   …………
}esac
 
}case语句以esac结尾,每个分支后两个“;”是必须的
}case语句中的pattern可以使用如下结构
}“或”结构,如“a|b|c”匹配a或b或c
}[范围],如“[0-9]”匹配单个数字
}“?”匹配任何单个字符
}“*”匹配任何零个或多个字符
}使用“*”,相当于C语言default分支
}以上结构可以组合使用,如:
}“[0-9]|0x[0-9A-Fa-f]”
 
}Shell中while循环的语法如下:
}while command
}do
}    list
}done  #循环语句必须以done结尾
}1、执行命令command
}2、如果执行成功(返回值为0),
}      则执行list命令列表
}3、重复1,直至command命令失败(返回非零值)
 
}Shell中until循环的语法如下:
}until command
}do
}   list
}done  #循环语句必须以done结尾
}1、执行命令command
}2、如果执行失败(返回值非0),
}      则执行list命令列表
}3、重复1,直至command命令执行成功(返回0)
 
 
}Shell中for循环的语法如下:
}for name in word1 word2 ... wordN
}do
}   list
}done  #循环语句必须以done结尾
}name为变量名,word1到wordN是由空格分开的单词列表
}for循环每次执行时,变量name被设为列表中的下一单词
}for循环常用于处理文件集合
 
 
}例如:修改一个目录下所有文件的文件名,在文件名后加上“.bak”
}for file in $HOME/*
}do
}    mv $file ${file}.bak
}done
 
}Shell中的特殊字符
}* ? [ ] ' " / $ ; & ( ) | ^ < > 换行  空格  tab
}单引号“'”:单引号内的所有特殊字符都失去其特殊含义,包括换行符
}“'”必须成对出现。一对“'”之间不能嵌入“'”,前面用“/”转义也不可以
}反引号“`”:反引号内是一组命令。Shell将反引号替换为该命令的输出。反引号对特殊字符的处理与双引号基本相同
 
 
}双引号“"”:双引号内的大部分字符失去特殊含义,下面的字符除外:
◦$      $用于变量替换
◦`     反引号用于命令替换
◦/$    $作为美元符,而不具备特殊含义
◦/`     `作为反引号,而不具备特殊含义
◦/"     使用嵌入的双引号
◦//       使用嵌入的反斜线
◦其它的/字符都作为普通字符
 
}定义变量
name=value    中间不能有空白
 
变量名只能包含字母、数字或者下划线,并且只能以字母或下划线开头
 
}引用变量时,在变量名前加 $符
}特殊的变量
◦$$ 当前执行Shell的进程ID
◦$1 … $9 命令行参数
◦$@或$*  命令行参数
◦环境变量:子进程可以继承父进程的环境变量,在sh下,用export命令将一个变量设为环境变量
}在ksh中,${#name} 为变量name值的长度
 
}command > filename 把把标准输出重定向到一个新文件中
}command >> filename 把把标准输出重定向到一个文件中(追加)
}command 1 > fielname 把把标准输出重定向到一个文件中
}command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
}command 2 > filename 把把标准错误重定向到一个文件中
}command 2 >> filename 把把标准输出重定向到一个文件中(追加)
}command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
}command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
}command < filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入
}command << delimiter 把从标准输入中读入,直至遇到d e l i m i t e r分界符
}command <&m 把把文件描述符m作为标准输入
}command >&m 把把标准输出重定向到文件描述符m中
}command <&- 把关闭标准输入
}
 
1、在命令行中指定调试模式执行
 
}指定SHELL –x 程序名称,如:
}sh –x update_iuser214.sh
}
2、 执行SHELL
 
}前台执行:
}   >sh 程序名称
}            >程序名称
}后台执行:
}           >sh 程序名称  &
}           >程序名称     &
}
 
}查找和编辑文本,主要用于按指定模式查找,替换,插入,删除文件内容
}直接键入命令
}Sed [-option] command_line filename
}将sed命令插入脚本文件,然后调用sed
}Sed [-option] –f program_file filename
}选项:
}e 使用命令行作为sed的编辑命令
}n 不打印
 
命令   意思
 
P         打印匹配行
 
=          显示文本行号
 
a/         在定位行号后附加新文本信息
 
i/          在定位行号前插入新文本信息
 
d          删除定位行
 
c/         用新文本替换定位文本
 
s          使用替换模式
 
r           从一个文件中读文本
 
w          将文本写到一个文件
 
Sed打印文件的第二行
 
            sed –n ‘2p’ filename
 
Sed打印匹配test的行
 
            sed –n ‘/test/p’ filename
 
Sed替换文本
 
           sed ‘s/night/NIGHT’  filename
 
           sed ‘s/night/NIGHT/g’ filename  
 
删除仅包含空行的行
 
           sed ‘/^[]*$d’ filename
 
Awk是一种程序语言,对于文档里的资料做修改、比较、抽取等处理
 
格式:
 
      awk [-F char] ‘command_line’ filename
 
-F char 确定间隔符
 
删除偶数行
 
       awk ‘{if(NR%2==1) print $0}’ filename
 
获取输入行中域最大的数
 
      awk ‘{if(NF>max) max=NF} END {print max}’ filename
 
输出超过80个字符的行
 
       awk ‘{length($0)>80 }’ filename
 
良好的注释能够增加代码可读性
 
脚本执行与定义分离,增强代码可扩展性
 
}理解需求,需要对外提供什么样的接口
}将需求分解成小步骤
}增加必要的注释
}区分变量的使用,全局变量与局部变量的使用
}写伪代码,提取出共性部分使用函数实现
}逐步实现小需求,逐步调试
}尽量使用变量,提供可扩展性,保证脚本后续的维护
}减少频繁对外的交互
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜