Shell编程入门总结(bash相关命令篇)

Shell编程入门总结(bash相关命令篇)


前言:

        最近看鸟哥的linux学习了一下shell编程,一时上手感觉还是比较生疏,所以特地把一些基本常用的知识做了一个总结,总结中并没有涵盖鸟哥书中所有的内容,当然更高级的shell编程也没有涉及,如果对这些内容有兴趣的话可以自行去看看鸟哥的书或者一些相关shell编程的书,在这里博主还是以基础为主。


一、Shell的变量功能

1.1 变量的显示

echo $PATH

echo ${PATH}

这里PATH就是一个变量,用echo命令即可将变量显示出来,如果显示为空则表示不存在此变量


1.2 变量的设置与修改规则

①  变量与变量内容以一个等号”=”来连接,如下所示:

myname=Guardian


②  等号两边不能直接接空格符,如下所示为错误的:

my name=VBird 或 myname=VBird Tsai


③  变量名称只能是英文字母与数字,但是开头字符不能是数字


④  变量内容若有空格符可以使用双引号或单引号将变量内容结合起来

-双引号内的特殊字符如$等,可以保存原本的特性,如下所示:

若var=”lang is $LANG”则var的真实值可能是”lang is en.US”类似的值

-单引号则将特殊字符解释为纯文本


⑤  可用转移字符”\”将特殊字符变成一般字符


⑥  在一串命令中,还需要通过其他的命令提供的信息,可以用反单引号”`命令`”或者”$(命令)”。(反单引号是键盘上方数字键1左边的那个按键)如下:

version=$(uname -r)


⑦  若该变量为了增加变量内容时,则可用”$变量名称”或”${变量}”累加内容,如下所示:

PATH=”PATH”:/home/bin


⑧  若该变量要在其他子进程执行,则要以export命令将其变成环境变量


⑨  通常大写字符为系统默认变量,自行设置变量可以使用小写字符


1.3 取消变量

方法为使用”unset 变量名称”,例如”unset myname”


1.4 变量相关命令及其他变量操作

【查看已设变量】

export/env        查看环境变量

set                    查看所有变量


【变量键盘读取、数组与变量声明】

①  read [-pt] variable     等待用户输入变量值(从键盘)

-p:后面可以接提示字符串

-t:后面可以接等待”秒数”


②  declare [-ixr] variable        变量声明

-i:将后面名为variable的变量定义成为整数数字类型

-x:用法和export一样,将变量变成环境变量

-r:将变量设置成为readonly类型,该变量不可被更改内容,也不能重设


③  数组

var=(one two three) 或者

var[1]=one ; var[2]=two ; var[3]=three

均可声明并设置数组变量

一般来说,建议直接以${数组}的方式来读取会比较正确无误


【变量内容的删除、替代与替换】

变量配置方式 说明
${变量#关键词}
${变量##关键词}
若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}
${变量%%关键词}
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串}
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』
变量配置方式 str 没有配置 str 为空字符串 str 已配置非为空字符串
var=${str-expr} var=expr var= var=$str
var=${str:-expr} var=expr var=expr var=$str
var=${str+expr} var= var=expr var=expr
var=${str:+expr} var= var= var=expr
var=${str=expr} str=expr
var=expr
str 不变
var=
str 不变
var=$str
var=${str:=expr} str=expr
var=expr
str=expr
var=expr
str 不变
var=$str
var=${str?expr} expr 输出至 stderr var= var=$str
var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str

 

二、通配符与特殊符号

2.1 通配符

符号 意义
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。


2.2 特殊符号

符号 内容
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定
; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将命令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向 (这两个留待下节介绍)
' ' 单引号,不具有变量置换的功能
" " 具有变量置换的功能!
` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!

补充:$?表示命令回传值,当上一个命令执行正确$?会等于0,否则会是一个非0值,利用这一点还有&&,||两个符号可以进行判定操作,cmd1 && cmd2表示若cmd1执行正确则执行cmd2,若cmd1执行不正确则cmd2不执行,||符号与&&相反。

 

三、数据流重定向
        我们执行一个命令的时候这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。这里的输出氛围2种,一种叫做”标准输出”,另一种为”标准错误输出”。这两个输出默认都是输出到屏幕上,为了把这2个输出保存下来或者区分开来就要用到重定向。当然,由文件读入数据也可以用重定向来完成。


3.1 输出

标准输出:代码为1,可省略,使用>或>>

标准错误输出:代码为2,使用2>或2>>

说明:>为向新文件中输出,文件若存在则会覆盖,>>不会覆盖而是累加在原文件后面

例:

find /home –name .bashrc > list_right 2> list_error

PS:若有不用信息可以指向/dev/null表示丢弃


3.2 输入

代码为0,可省略,使用<或<<

说明:<可用作将文件内容作为标准输入,<<则表示键盘输入至”结束符”为止

例:

cat > catfile < ~/.bashrc            文件->文件

cat > catfile << ”eof”                 键盘输入至”eof”停止作为stdin


3.3 双向重定向

tee [-a] file      输出屏幕同时存入file中

-a:以累加的方式加入file,默认是覆盖

例:

last | tee last.list

 

四、管道命令

        管道命令”|”能将前一个命令的输出信息作为输入信息做进一步的处理,但对标准错误信息没有直接处理能力。而且在每个管道后面接的命令必须要能够接收stdout的数据才行,这样的命令才可以是”管道命令”。


4.1 选取命令

①  cut –d ‘分隔符’ –f fields

对每行数据以”分隔符”分割后去fields范围内的数据

例:

echo $PATH | cut –d ‘:’ –f 3,5

表示以’:’切分后列出第3个和第5个

cut –c 字符范围

对每行数据去除字符范围内的字符

例:

export | cut -c 12-

表示每行从第12个字符开始显示


②  grep [-cinv] ‘查找字符串’ filename

-c:计算找到字符串的次数,只输出次数

-i:忽略大小写

-n:顺便输出行号

-v:反向选择

例:

last | grep –v ‘root’


4.2 排序,统计,去重

①  sort [-fbnrutk] [file or stdin](以行为单位)

-f:忽略大小写

-b:忽略最前的空白

-n:使用纯数字进行排序(默认为文本类型)

-r:反向排序

-u:去重,相同的数据仅显示一行

-t:分隔符,默认为[Tab]

-k:以那个区间来排序

例:

cat /etc/passwd | sort –t ‘:’ –k 3

表示以’:’切分后第3个区间内容排序


②  uniq [-ic]

-i:忽略大小写

-c:对不同的数据计数

PS:uniq去重只去除相邻行的数据,所以要先用sort


③  wc [-lwm] (words count)

-l:仅列出行

-w:仅列出多少字(英文单词)

-m:仅列出多少字符

默认为都列出


4.3 参数代换:xargs

xargs用于产生某个命令参数(多用于非管道命令)。xargs可以读入stdin的数据,并且以空格符或断行字符进行分辨,将stdin的数据分隔成arguments。

用法:xargs [-epn] command

-e:这个是EOF的意思,后面可以接一个字符串,当xargs分析到这个字符串就停止

-p:在执行每个命令的参数时,都会询问用户的意思

-n:后面接次数,每次command命令执行时,要是用几个参数的意思

PS:xargs后没接命令时默认以echo输出,且-e与字符串中间必须连在一起没空格

例:

cut –d ‘:’ –f 1 /etc/passwd | xargs –p –n 5 finger

一次查阅5个账号

        

基本上常用的就总结这么多,用于基础的shellscript是够用了。如果想更深入了解就自行查阅相关书籍吧。







本文固定链接:http://blog.csdn.net/fyfmfof/article/details/45014575转载请注明出处

你可能感兴趣的:(Linux,学习笔记,linux,shell,bash)