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转载请注明出处