第十七章 创建函数
function name {
commands } name() {
commands }
- 要在使用函数前定义他,否则会报错,函数名要唯一,否则会覆盖
- 函数的退出状态码为其中最后一条命令的退出状态码(使用函数默认退出状态码很危险)
- 使用return $[ $value * 2 ]这种return命令可以改变函数的退出状态码,只能为0-255
- result=$(dbl)会将函数的输出赋给变量 函数中的read里的命令提示选项不会被算进STDOUT中,但echo对他进行提示时就会算
- 由于函数使用特殊参数环境变量作为自己的参数值,因此它无法直接获得脚本在命令行中的参数值,非要使用的话就得给他们传过去value=%$(func7 $1 $2)
- local temp
- 向函数传递数组参数:myarray=(1 2 3 4 5) testit ${myarray[]}(光传myarray的话只能取数组的第一个值);函数会建一个local newarray newarray=(`echo “$@”`)从函数返回数组时echo ${newarray[]}
function factoridal {
if [ $2 -eq 1] then echo 1 else local temp=$[ $1 - 1] local result=`factoridal $temp` echo $[ $result * $1 ] fi }
- source又名点操作符. 即. ./myfuns用于库函数的引入;会在当前shell的上下文中执行命令,而不是创建一个新的shell
- 命令行上创建函数
function divem {
echo $[ $1 / $2]; echo "nb";} function multem{
echo $[ $1 * $2 ] } #这种方式不用每个命令都加;按空格就可以换下一行
- 在.bashrc文件中定义函数;shell会将定义好的函数传给子shell进程
- shtool脚本函数库
- vim的复制粘贴:cv攻城狮变成yp攻城狮
- 注释:这里
第十八章 图形化桌面环境中的脚本编程
- 创建菜单函数:一般为还没有实现的函数先创建一个桩函数(空函数)
- select 的PS3环境变量(list列表后显示的东西)
select varibale in list do commands(一般为case语句) done
- select就是不用你echo和read了,提供了一个便捷的菜单函数
- dialog --widget parameters dialog使用了STDERR和退出状态码
- KDE下的kdialog和GNOME下的zenity
第十九章 初始sed和gawk
- 命令行编辑器(sed gawk)他们两个都是流编辑器,来处理数据流的数据,一行一行读数据并处理,sed只会将修改后的所有数据发送到STDOUT
sed options script file echo "a" | sed 's/a/b/' sed 's/dog/cat/' date.txt 下面为多个命令加-e就行,用;分隔 sed -e 's/brown/green/; s/dog/cat/' date.txt sed -e ' s/brown/green/ s/fox/ele/ s/dog/cat/' data.txt 下面为从文件中读取编辑器命令 sed -f script.sed data.txt
- gawk程序让流编辑迈上了新的台阶,提供了一种编程语言而不是编辑器命令;它通常用来在大文本文件中提取数据元素,并将他们格式化成可读的报告;$0 $1 $2 $3
gawk options program file gawk '{print "hello world"}' #ctrl + d 可以生成EOF终止改gawk程序继续从STDIN读取数据,让他退出来 gawk '{print $1}' data.txt gawk -F: '{print $1}' /etc/passwd #-F可以指定分隔符 echo "my name is sb" | gawk '{$4="nb"; print $0}' gawk '{ $4="nb" print $0}' 等待STDIN my name is sb gawk -F: -f script.gawk /etc/passwd 指定脚本文件 脚本文件可以这么写,gawk中的变量不加$,可以在里面直接定义分隔符 {
FS=":" text = "'s home is" print $1 text $6 } gawk 'BEGIN {print "nb"}' gawk 'END {print "nb"}'
- sed编辑器基础
4种替换标记 sed 's/test/trial/2' data.txt(每行里第几次出现) sed -n 's/test/trial/p' data.txt p会打印匹配的行,通常与-n一起用,-n禁止sed编辑器的输出 sed 's/test/trial/g' data.txt 替换所有匹配的地方(默认的话只匹配每行第一次出现的test) sed 's/test/trial/w test.txt' data.txt 会正常输出,不过修改过的行会保存到指定文件中 sed 's!bin/bash!/bin/csh!' /etc/passwd 特殊情况可以使用别的字符串分隔符 行寻址 sed '2s/test/trial/' data.txt sed '2,3s/test/trial/' data.txt sed '2,$s/test/trial/' data.txt 到文件末尾 文本模式过滤器 /pattern/command sed '/samantha/s/bash/csh/' /etc/passwd 命令组合 sed '2,3{ s/fox/ele/ s/dog/cat/ }' data.txt sed '3d' data.txt sed '/number 1/d' data.txt sed '/1/,/3/d' data.txt 用两个文本模式删除区间,要注意问题:没找到停止模式的话就会全给删了 插入和附加文本 sed '[adress]command\ new line' sed '1i\ abc\ daef' data.txt 或a(之后) 修改行 sed '3c\ abc' data.txt sed '/number 3/c\ 文本模式修改可以匹配任意行 abc' data.txt 转换命令y是唯一可以处理单个字符的sed编辑器命令,不过是全局的 sed 'y/123/789' data.txt sed -n '/number 4/{ = 显示当前行号 p }' data.txt sed -n 'l' data.txt 能显示出不可打印的ASCII字符 [address]w filename sed '1,2w test.txt' data.txt sed -n '/browncoat/w browncoat.txt' data.txt [address]r filename sed '/browncoat/r browncoat.txt' data.txt 将browncoat中数据读取到data的某行后 配合删除使用,可以删除占位文本 sed '/LIST/{ r data.txt d }' notice.std
第二十章 正则表达式
- 正则表达式通过正则表达式引擎实现;sed用的BRE,gawk用的ERE
- 正则表达式区分大小写,只要定义的文本出现在数据流中,就能匹配,空格和其他的字符没什么区别.
- 锚字符 ^为脱字符,锁定行首 ; $为行尾锚点
以下为BRE的规则 '/^this/' 放在别的位置的话^就表示别的意思了 '/this$/' sed '/^$/d' data.txt 过滤空白行 '/.at/' 点号,必须匹配一个字符 '/[ch]at/' 方括号定义字符组 '/[ab][ab][ab]/' '/[^ch]at/' 排除型字符组 '/[a-zA-Z]at/' '/[a-dg-h]at/' [[:alpha:]] 有一系列的特殊字符组,表示匹配任意字符 '/ie*k/' '/b[ae]*t/'
ERE的额外符号 '/be?t/' ?表明前面的字符可以出现1或0次 '/b[ae]?t/' '/be+t/' ?表明前面的字符可以出现1或多次 '/b[ae]+t/' {}可以为可重复的正则表达式指定一个上限,称为间隔 gawk默认不识别间隔,--re- interval选项才会识别 '/be{1}t/' '/be{1,3}t/' '/b[ae]{1,3}t/' '/[ch]at|dog/' 管道符号表示or '/sat(urday)?/' ()表示分组 '/(c|b)a(b|t)/'
- p440的几个实例挺好的
第二十一章 sed进阶
- 三个用来处理多行文本的特殊命令 N D P
sed '/header/{n ; d}' data.txt 小写n表示让sed移动到下一行 sed '/header/{N ; s/\n/ /}' data.txt 合并到模式空间处理 解决N中最后一行无法处理的问题 sed ' s/ab c/cd e/ N s/ab\nc/cd\ne/ ' data.txt sed 'N ; /ab\nc/D' data.txt D只删除第一行 sed -n 'N ; /ab\nc/P' data.txt P只显示第一行
- 模式空间和保存空间:hHgGx
sed -n '/a/!p' data.txt 排除命令 分支 [address]b [label] 没有lable的话会调到脚本末尾 sed '{ /first/b jump1 ; s/first/second/ :jump1 s/first/third/}' data.txt p455的永远不会结束的问题可以看一下 测试 根据替换命令的结果跳转到某个标签 sed '{ s/first/matched t s/first/second/ }' data.txt 没label时,测试成功时会调到末尾,失败时调到标签
- 模式替代
echo "the cat sleeps in his hat." | sed 's/.at/"&"/g' &符号 sed's/\(system\) abc/\1 user' \1 \2表示子模式分配字符 p158\{
3\}这种没在sed介绍过,不知道原理,只知道大概意思
- 用$()将sed命令的输出重定向到一个变量中
- 行间距问题
sed 'G' data.txt G是将保持空间的内容附加到模式空间之后,一开始为空行 sed '/^$/d; $!G' data.txt sed '=' data.txt | sed 'N; s/\n/ /' sed '{ :start $q ; N ; 11,$D b start }' data.txt 打印末尾几行 sed '/./,/^$/!d' data.txt 删除连续空白行 sed '/./,$!d' data.txt 删除开头空白行 sed '{ :start /^\n*$/ {$d; N; b start} }' 删除末尾空白行,现在确实不是很理解 p465 s/<[^>]*>/ /g
第二十二章 gawk进阶
- FS,RS,OFS,OR内建变量
- gawk ‘BEGIN{FIELDWIDTHS=“3 5 2 5”}{print $1, $NF}’ data
- ENVIRON[“HOME”]等用于提取shell环境变量
- FNR和NR(多个输入文件时,NR会一直计数,FNR在不同文件中会清0)
- gawk 'BEGIN{x=4; x= x * 2 + 3; print x}'脚本中给变量赋值
- gawk -f script n=2 data 在命令行中给变量赋值(这样的话这个值在BEGIN下不可用,除非加-v)
- cap[“abc”]有这样的数组
gawk 'BEGIN{ var["a"] = 1 var["b"] = 2 var["c"] = 3 for (test in var) test直接为索引了 { print test , var[test] } }'
- delete array[index]
- 使用正则表达式之前,正则表达式必须要出现在它要控制的程序脚本的左花括号前gawk ‘BEGIN{FS=“,”} /ab/{print $1}’ data
- 匹配操作符~允许将正则表达式限定在记录中的特定数据字段gawk ‘BEGIN{FS=“,”} $2 ~ /^data/ {print $1}’ data
- gawk ‘BEGIN{FS=“,”} $2 !~ /^data/ {print $1}’ data
- gawk -F: ‘$4 == 0{print $1}’ /etc/passwd 用这种数学表达式
- gawk -F: ‘$4 == “rich”{print $1}’ /etc/passwd 必须完全匹配
gawk '{if ($1 > 20) print $1;else print $1/2}' data gawk '{ if($1 > 20) { x=$1 * 2 print x } }' data
- while do-while for
- printf 和c语言的一样
- 提供的函数和自定义的函数(写在所有代码块之前,包括BEGIN)
- 创建函数库 gawk -f funclib -f script data
第二十三章使用其他shell
- dash shell zsh shell
24-26章 应用
- 无聊的时候再写一下玩玩
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/shellbc/1541.html