您的位置:首页 > 运维架构 > Shell

SHELL笔记

2016-06-03 20:05 357 查看
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

head file

打印文本文件开头几行

tail 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, USA

print与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(
)

反短斜线可以将一个命令的输出作为其它命令的命令行参数。

将过去24小时内修改过的文件打包

#!/bin/sh

# The ticks are backticks (
) not normal quotes (‘):

tar -zcvf lastmod.tar.gz
find . -mtime -1 -type f -print


流程控制

if



大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可 读等等……通常用” [ ] “来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

[ -f “somefile” ] :判断是否是一个文件

[ -x “/bin/ls” ] :判断/bin/ls 是否存在并有可执行权限

[ -n “var"]:判断var 变量是否有值

[ “a"="b” ] :判断a和b 是否相等

通过
man test
查看所有测试表达式可以比较和判断的类型

逻辑操作符
&& ||


[ -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“File1 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell