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
良好的注释能够增加代码可读性
脚本执行与定义分离,增强代码可扩展性
}理解需求,需要对外提供什么样的接口
}将需求分解成小步骤
}增加必要的注释
}区分变量的使用,全局变量与局部变量的使用
}写伪代码,提取出共性部分使用函数实现
}逐步实现小需求,逐步调试
}尽量使用变量,提供可扩展性,保证脚本后续的维护
}减少频繁对外的交互