一:Shell的变量 功能
变量定义:myname=www 变量使用:$myname 或 ${myname} 单双引号:"$myname"=www, '$myname'=$myname 跳脱字符:"\ "将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符 使用命令:使用反单引号『`命令`』或 『$(命令)』 扩增内容:PATH="$PATH":/home/bin 取消变量:unset myname 子进程用:export myname $:(关于本 shell 的 PID) ?:(关于上个运行命令的回传值)
read [-pt] variable 选项与参数: -p :后面可以接提示字符! -t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦! declare [-aixr] variable 选项与参数: -a :将后面名为 variable 的变量定义成为数组 (array) 类型 -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型 -x :用法与 export 一样,就是将后面的 variable 变成环境变量; -r :将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset 数组操作:array[index]=value
变量内容的删除与取代
变量配置方式 | 说明 |
${ 变量# 关键词} ${ 变量## 关键词} |
若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除 |
${ 变量% 关键词} ${ 变量%% 关键词} |
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除 |
${ 变量/ 旧字符串/ 新字符串} ${ 变量// 旧字符串/ 新字符串} |
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』 |
变量的测试与内容替换
变量配置方式 | 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 |
通配符与特殊符号
符号 | 意义 |
* | 代表『 0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 |
[ ] | 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
[ - ] | 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
[^ ] | 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 |
特殊符号
符号 | 内容 |
# | 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 |
\ | 跳脱符号:将『特殊字符或通配符』还原成一般字符 |
| | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); |
; | 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 用户的家目录 |
$ | 取用变量前导符:亦即是变量之前需要加的变量取代值 |
& | 工作控制 (job control):将命令变成背景下工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 数据流重导向:输出导向,分别是『取代』与『累加』 |
<, << | 数据流重导向:输入导向 (这两个留待下节介绍) |
' ' | 单引号,不具有变量置换的功能 |
" " | 具有变量置换的功能! |
` ` | 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合! |
二:数据流重导向
标准输入 (stdin) :代码为 0 ,使用 < 或 << ; 标准输出 (stdout):代码为 1 ,使用 > 或 >> ; 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ; stdout 与 stderr 分存到不同的文件去: find /home -name .bashrc > list_right 2> list_error 将错误的数据丢弃,屏幕上显示正确的数据: find /home -name .bashrc 2> /dev/null 将命令的数据全部写入名为 list 的文件中: find /home -name .bashrc > list 2> list <==错误 find /home -name .bashrc > list 2>&1 <==正确 find /home -name .bashrc &> list <==正确
cmd1 && cmd2 cmd1 || cmd2 cmd1 && cmd2 || cmd3,这个顺序通常不会变 ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
三、管线命令 (pipe)
cut -d'分隔字符' -f fields <==用于有特定分隔字符 cut -c 字符区间 <==用于排列整齐的信息 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间; echo $PATH | cut -d ':' -f 3,5 export | cut -c 12-
grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! --color=auto :可以将找到的关键词部分加上颜色的显示喔!
sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空格符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用『纯数字』进行排序(默认是以文字型态来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符,默认是用 [tab] 键来分隔; -k :以那个区间 (field) 来进行排序的意 uniq [-ic] 选项与参数: -i :忽略大小写字符的不同; -c :进行计数 wc [-lwm] 选项与参数: -l :仅列出行; -w :仅列出多少字(英文单字); -m :多少字符;
tee [-a] file 选项与参数: -a :以累加 (append) 的方式,将数据加入 file 当中! tr [-ds] SET1 ... 选项与参数: -d :删除信息当中的 SET1 这个字符串; -s :取代掉重复的字符! col [-xb] 选项与参数: -x :将 tab 键转换成对等的空格键 -b :在文字内有反斜杠 (/) 时,仅保留反斜杠最后接的那个字符 join [-ti12] file1 file2 选项与参数: -t :join 默认以空格符分隔数据,并且比对『第一个字段』的数据, 如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个! -i :忽略大小写的差异; -1 :这个是数字的 1 ,代表『第一个文件要用那个字段来分析』的意思; -2 :代表『第二个文件要用那个字段来分析』的意思。 paste [-d] file1 file2 选项与参数: -d :后面可以接分隔字符。默认是以 [tab] 来分隔的! - :如果 file 部分写成 - ,表示来自 standard input 的数据的意思 expand [-t] file 选项与参数: -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。 我们也可以自行定义一个 [tab] 按键代表多少个字符呢!
split [-bl] file PREFIX 选项与参数: -b :后面可接欲分割成的文件大小,可加单位,例如 b, k, m 等; -l :以行数来进行分割。 PREFIX :代表前导符的意思,可作为分割文件的前导文字。
xargs [-0epn] command 选项与参数: -0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空格键等等字符时,这个 -0 参数 可以将他还原成一般字符。这个参数可以用于特殊状态喔! -e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到 这个字符串时,就会停止继续工作! -p :在运行每个命令的 argument 时,都会询问使用者的意思; -n :后面接次数,每次 command 命令运行时,要使用几个参数的意思。看范例三。 当 xargs 后面没有接任何的命令时,默认是以 echo 来进行输出喔!
关于减号 - 的用途 tar -cvf - /home | tar -xvf - 上面这个例子是说:『我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前一个命令的 stdout, 因此,我们就不需要使用 file 了!这是很常见的例子喔!注意注意!
四、正则表达式
[:alnum:]0-9A-Za-z [:alpha:]A-Za-z [:digit:]0-9 [:upper:]A-Z [:lower:]a-z [:blank:]空格和Tab [:cntrl:]控制按键,CR\LF\Tab\Del..等 [:graph:]除空格和Tab [:print:]任何可被打印的字符 [:punct:]标点符号 [:space:]任何产生空白的字符,如空格、Tab、CR等 [:xdigit:]16进制数字,包括0-9、A-F、a-f
grep [-A] [-B] [--color=auto] '搜寻字串' filename 选项与参数: -A :后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来; -B :后面可加数字,为 befer 的意思,除了列出该行外,前面的 n 行也列出来; --color=auto 可将正确的那个撷取数据列出颜色 dmesg | grep -n -A3 -B2 --color=auto 'eth'
利用中括号 [] 来搜寻集合字节 grep -n '[0-9]' regular_express.txt 行首与行尾字节 ^ $ grep -v '^$' /etc/syslog.conf | grep -v '^#' 任意一个字节 . 与重复字节 * . (小数点):代表『一定有一个任意字节』的意思; * (星星号):代表『重复前一个字节, 0 到无穷多次』的意思,为组合形态 grep -n 'g..d' regular_express.txt grep -n 'ooo*' regular_express.txt grep -n 'g.*g' regular_express.txt 限定连续 RE 字符范围 {} grep -n 'go\{2,5\}g' regular_express.txt
sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。 -e :直接在命令列模式上进行 sed 的动作编辑; -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作; -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改读取的文件内容,而不是由萤幕输出。 动作说明: [n1[,n2]]function n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作 是需要在 10 到 20 行之间进行的,则『 10,20[动作行为] 』 function 有底下这些咚咚: a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 正规表示法!例如 1,20s/old/new/g 就是啦!
grep -E egrep +:重复『一个或一个以上』的前一个 RE 字符 egrep -n 'go+d' regular_express.txt ?:『零个或一个』的前一个 RE 字符 egrep -n 'go?d' regular_express.txt |:用或( or )的方式找出数个字串 egrep -n 'gd|good' regular_express.txt egrep -n 'gd|good|dog' regular_express.txt ():找出『群组』字串 egrep -n 'g(la|oo)d' regular_express.txt ()+:多个重复群组的判别 echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
五、文件格式化处理
printf '列印格式' 实际内容 选项与参数: 关於格式方面的几个特殊样式: \a 警告声音输出 \b 倒退键(backspace) \f 清除萤幕 (form feed) \n 输出新的一行 \r 亦即 Enter 按键 \t 水平的 [tab] 按键 \v 垂直的 [tab] 按键 \xNN NN 为两位数的数字,可以转换数字成为字节。 关於 C 程序语言内,常见的变量格式 %ns 那个 n 是数字, s 代表 string ,亦即多少个字节; %ni 那个 n 是数字, i 代表 integer ,亦即多少整数码数; %N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数码数, 假设我共要十个位数,但小数点有两位,即为 %10.2f 罗!
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename awk 的命令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键来隔开每个命令, 逻辑运算当中,如果是『等於』的情况,则务必使用两个等号『==』! 格式化输出时,在 printf 的格式配置当中,务必加上 \n ,才能进行分行! 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。
相关推荐
根据提供的信息,我们可以推断这本书主要讨论的是Linux Shell的相关内容。由于给定的部分内容只包含了一个网站链接(www.linuxidc.com),我们无法从中直接提取到具体的知识点。因此,接下来将基于“Linux Shell”这...
有关几个shell脚本的编写,如:编写一个shell脚本程序,它带一个命令行参数,这个参数是一个文件。如果这个文件是一个普通文件,则打印文件所有者的名字和最后的修改日期...加入了自己的注释理解
《精通Linux Shell脚本编程》是一本深入探讨Linux操作系统中Shell脚本的专著,旨在帮助读者提升在Linux环境中编写高效、实用脚本的能力。Shell脚本是Linux系统中的强大工具,它允许用户通过编写简单或复杂的命令序列...
在本学习资料包中,包含了三本关于Linux Shell的重要书籍:《Linux Shell编程艺术》、《Linux Shell脚本攻略》以及《Linux Shell从入门到精通》,这些资源将帮助你全面深入地理解和掌握Linux Shell。 《Linux Shell...
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
文件包含大作业shell脚本(快速备份系统)源码,实验课做的Linux实验shell脚本:Samba实验,DDNS(DHCP服务器 和DNS服务器的配置)的shell脚本,运行脚本每个实验只需要两三分钟即可完成。 其中sy1为实验一脚本,sy2...
Linux Shell脚本攻略是一本针对Linux操作系统下Shell脚本编写的指导书籍。Shell脚本是利用Shell编程语言来控制和自动化命令序列的脚本,常用于系统管理、服务器管理、自动化任务处理等领域。本书的第三版包含了全面...
Linux Shell脚本手册 - 第三版,. This book will take you through useful real-world recipes designed to make your daily life easier when working with the shell.
**Linux Shell脚本攻略概述** Linux Shell脚本是Linux操作系统中一种强大的自动化工具,它允许用户通过编写脚本来执行一系列命令,实现系统管理和任务自动化。本书《Linux Shell脚本攻略》(第2版)深入浅出地介绍...
这是学习Shell的简单例子这是学习Shell的简单例子这是学习Shell的简单例子
毫无疑问, UNIX/Linux最重要的软件之一就是shell, 目前最流行的shell被称为Bash(Bourne Again Shell), 几乎所有的Linux和绝大部分的UNIX都可以使用Bash. 作为系统与用户之间的交互接口, shell 几乎是你在UNIX工作...
inux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。...Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统
18个Linux Shell脚本经典案例(1-18) 脚本 Dos攻击防范(自动屏蔽攻击IP) Linux系统发送告警脚本 MySQL数据库备份单循环 MySQL数据库备份多循环 nginx 访问访问日志按天切割 nginx nginx访问日志分析脚本 一键查看...
linux开发,运维必备,作为一本手头工具书很实用,不过有几处会有问题,不过影响不大
【Linux Shell程序设计 Ubuntu 实验二】实验主要涵盖了Linux操作系统中的Shell编程基础,适用于Ubuntu环境。实验目的是让学生掌握Bash Shell的创建与执行方法,理解基本语法,并学会编写Shell脚本。实验报告要求遵循...
Linux Shell 编程基础教程 本资源为 Linux Shell 编程基础教程,涵盖了 Linux Shell 编程的基础知识,包括语法基本介绍、变量、环境变量、Shell 命令和流程控制等。 一、语法基本介绍 在 Linux Shell 编程中,...
Linux Shell是Linux操作系统中用于与系统交互的命令行界面,它是用户与系统内核之间的接口。这个名为"Linux-Shell-Tutorial.rar_Linux shell"的压缩包文件显然包含了一个关于Linux Shell的教程,旨在帮助用户深入...
Linux shell概念