Linux shell

xiaoxiao2021-03-01  14

一: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=exprvar=var=$strvar=${str:-expr}var=exprvar=exprvar=$strvar=${str+expr}var=var=exprvar=exprvar=${str:+expr}var=var=var=exprvar=${str=expr}str=expr var=exprstr 不变 var=str 不变 var=$strvar=${str:=expr}str=expr var=exprstr=expr var=exprstr 不变 var=$strvar=${str?expr}expr 输出至 stderrvar=var=$strvar=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$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 (浮点),如果有小数码数, 假设我共要十个位数,但小数点有两位,即为 .2f 罗!

 

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename awk 的命令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个命令辅助时,可利用分号『;』间隔, 或者直接以 [Enter] 按键来隔开每个命令, 逻辑运算当中,如果是『等於』的情况,则务必使用两个等号『==』! 格式化输出时,在 printf 的格式配置当中,务必加上 \n ,才能进行分行! 与 bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $ 符号。

  

 

 

 

相关资源:LINUX SHELL编程从初学到精通
转载请注明原文地址: https://www.6miu.com/read-3200241.html

最新回复(0)