2016-05-30
1. Shell 参数
- $0 Shell本身的文件名
- $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…
- $$ Shell本身的PID(ProcessID)
- $! Shell最后运行的后台Process的PID
- $? 最后运行的命令的结束代码(返回值)
- $- 使用Set命令设定的Flag一览
- $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有数。
- $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
- $# 添加到Shell的参数个数
- wc –l file wc -w file wc -c file
分别计算文件的行数(line) 、单词数(word)和字符数(character) - grep ‘pattern’ file
在文件内搜索字符串或和正则表达式匹配的字符串 - cut -b column file
将指定范围内的文件内容输出到标准输出设备 (屏幕) 上。 比如: 输出5每至行9第个字符 cut -b5-9 file.txt, 注意不要和 cat 命令混淆,这是两个完全不同的命令 - cat file.txt
输出文件内容到标准输出设备(屏幕)上 - file somefile
取得文件 somefile 的文件类型 - read var
read var 提示用户输入,并将输入内容赋值给变量var - sort file.txt
对 file.txt 文件所有行进行排序(显示在终端上,并不改变源文件) - uniq
只输出文件中内容不一致的行,如: sort file.txt | uniq - expr
进行数学运算,如要进行 2+3 的运算,命令为: expr 2 “+” 3 - find
搜索文件,如根据文件名搜索:find . -name filename -print - tee
将数据输出到标准输出设备(屏幕)和文件,比如:somecommand|teeoutfile -
- firstname file
返回不包含路径的文件名,如: basename /bin/tux 会返回 tux - dirname file
返回文件所在路径,如:dirname /bin/tux 会返回 /bin
- firstname file
-
- head file
打印文本文件开头几行 - tail file
打印文件末尾几行
- head file
- 查找替换sed
是一个基本的查找替换程序。 可以从标准输入 (如命令管道) 读入文本, 并将结果输出到标准输出幕)(;屏 该命令采用正则表达式进行搜索。不要和 shell 中的通配符相混淆。比如将 ubuntu 替换为 Ubuntu :cat text.file | sed ‘s/ubuntu/Ubuntu/’ > newtext.file awk
best awk document
awk
用来提取文本文件中的字段。 缺省的字段分割符是空格, 可以使用-F 指定其它分割符。cat file.txt | awk -F, '{print $1 "," $3 }'
, 这里我们使用 , 作为字段分割符, 同时打印第一和第三个字段。 如果该文件内容Ad为am Bor, 34, IndiaKerry Miller, 22, USA,则上述命令的输出为:Adam Bor, IndiaKerry Miller, USAprint与printf
awk中同时提供了print和printf两种打印输出的函数。其中print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。这里,逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。
printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
管道,重定向,backtick(`)
- 管道 (|) 将一个命令的输出作为另外一个命令的输入
grep "hello" file.txt | wc -l
- 重定向
将命令的结果输出到文件,而不是标准输出(屏幕) >
写入文件并复盖旧文件- ‘>>’ 加到文件末尾
- backtick(
)
) not normal quotes (‘):
反短斜线可以将一个命令的输出作为其它命令的命令行参数。
将过去24小时内修改过的文件打包
#!/bin/sh
# The ticks are backticks (
tar -zcvf lastmod.tar.gzfind . -mtime -1 -type f -print
- 管道 (|) 将一个命令的输出作为另外一个命令的输入
- 流程控制
- if
大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可 读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。
- [ -f “somefile” ] :判断是否是一个文件
- [ -x “/bin/ls” ] :判断/bin/ls 是否存在并有可执行权限
- [ -n “ var"]:判断 var 变量是否有值
- [ “
a"="
b” ] :判断
a和
b 是否相等
通过man test
查看所有测试表达式可以比较和判断的类型
- if
逻辑操作符
&& ||
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
表示如果/etc/shadow 文件存在, 则打印”This computer uses shadow passwords”。打印错误信息:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r “ mailfolder"]||echo"Cannotread$mailfolder”;exit1;echo“ mailfolder has mail from:”
grep “^From ” $mailfolder该脚本首先判断 mailfolder 是否可读, 如果可读则打印该文件中的”From” 一行。 如果不可读则或操作生效,
打印错误信息后脚本退出。case 语句
case 表达式可以用来匹配一个给定的字符串,而不是数字(可别和C 语言里的 switch…case 混淆) 。格式
case…in
…)do something here;;
esac例子:smartzip脚本
自动辨别出给定文件的类型,并自动解压
ftype=file "$1"
case “ ftype”in“ 1:Zip archive”*)
unzip “ 1”;;“ 1:gzip compressed”*)
gunzip “ s1”;;“ 1: bzip2 compressed"*) bunzip2 " 1”;;∗)error“File 1 can not be uncompressed with smartzip”;;
esac
select语句
- 格式
select var in …; do
break;
done
… now $var can be use - 例子
#!/bin/sh
echo “What is your favourite OS?”
select var in “Linux” “Gnu Hurd” “Free BSD” “Other”; do break
done
echo “Youhave selected $var” - 结果
What is your favourite OS? 1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
- 格式
while/for循环
- 格式
while…;do
…
done
- 格式