BASH Shell 经常使用命令

1、命令别名(alias)shell

假如我须要知道这个目录底下的全部档案(包含隐藏档)及全部的档案属性,那么我就必需要下达 ls -al 这样的指令列,有没有更快的取代方式?使用命令别名!也就是说, lm 会等于 ls -al 这样的一个功能你能够在指令列输入 alias 就能够知道目前的命令别名有哪些了!也能够直接下达命令来设定别名:bash

alias lm='ls -al'

2、变量设定规则spa

  1. 变量与变量内容以等号『=』来连结;命令行

  2. 等号两边不能直接接空格符;code

  3. 变量名称只能是英文字母与数字,可是数字不能是开头字符;排序

  4. 如有空格符可使用双引号『 " 』或单引号『 ' 』来将变量内容结合起来,但需要特别留意,双引号内的特殊字符能够保有变量特性,可是单引号内的特殊字符则仅为通常字符;索引

  5. 必要时须要以跳脱字符『 \ 』来将特殊符号(如Enter, $, \, 空格符, '等)变成通常符号;ip

  6. 在一串指令中,还须要藉由其它的指令提供的信息,可使用 quote 『 ` command` 』;字符串

  7. 若该变量为扩增变量内容时,则需以双引号及 $变量名称如:『 "$PATH":/home』继续累加内容;it

  8. 若该变量须要在其它子程序执行,则须要以 export 来使变量能够动做,如『export PATH』;

  9. 一般大写字符为系统预设变量,自行设定变量可使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好);

  10. 取消变量的方法为:『unset 变量名称』。

3、变量的有效范围

变量的设定只在目前这个 shell 环境当中存在,在下个或者是在子程序中 ( 子 shell ) 将不会存在!要让变量在下个程序也能够继续的使用,大概就是使用 export!此外,其实除了 shell 的父、子程序外,在脚本( scripts )的编写当中,因为有的软件会使用到 2 个以上的 scripts 作为一个完整的套件!也就是说,假如你有两支程序,一支为 scripts1.sh 以及 scripts2.sh ,而 scripts2.sh 会去引用 scripts1.sh 的变数,这个时候,你在 scripts1.sh 当中设定的变量请『千万记得以 export 设定』,不然你的变量将没法在两个 scripts 之间互相被引用!当这个 scripts 执行完毕以后,刚刚在 scripts 当中设定的变量也就『失效了!』。

4、read命令

直接读取用户输入的变量

[test @test test]# read name 
testing <==这个时候屏幕会等待使用者由键盘输入 
[test @test test]# echo $name 
testing <==刚刚输入的数据变成了变量的内容

5、array命令

[test @test test]# a[索引]=内容 
[test @test test]# echo ${a[索引]}  
[test @test test]# a[1]=4 
[test @test test]# a[2]=8 
[test @test test]# echo ${a[1]} ${a[2]} 
4 8

6、eval命令

功能说明:从新运算求出参数的内容。

语  法:eval [参数]

补充说明:eval可读取一连串的参数,而后再依参数自己的特性来执行。

参  数:参数不限数目,彼此之间用分号分开。
 
1.eval命令将会首先扫描命令行进行全部的替换,再执行命令。该命令使用于那些一次扫描没法实现其功能的变量。该命令对变量进行两次扫描。这些须要进行两次扫描的变量有时候被称为复杂变量。
2.eval也能够用于回显简单变量,不必定时复杂变量。
NAME=ZONE
eval echo $NAME等价于echo $NAME
3.两次扫描
test.txt内容:hello shell world!
myfile="cat test.txt"
(1)echo $myfile  #result:cat test.txt
(2)eval echo $myfile  #result:hello shell world!
从(2)能够知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令
4.得到最后一个参数
echo "Last argument is $(eval echo \$$#)"
echo "Last argument is $(eval echo $#)"

7、万用字符与特殊字符

因为在 bash 当中常会使用到一些万用字符,与搭配特殊符号来将指令作更好的利用(例如最常提到的正规表示法 Regulare Express )!底下咱们列出一些经常使用的万用字符与特殊符号:

符号 内容
* 万用字符,表明一个或多个字符(或数字)
? 万用字符,表明一个字母
# 批注,这个最常被使用在 script 当中,视为说明!
\ 跳脱符号,将『特殊字符或万用字符』还原成通常字符
| 分隔两个管线命令的界定;
; 连续性命令的界定(注意!与管线命令并不相同)
~ 使用者的家目录
$ 亦便是变量以前须要加的变量取代值
& 将指令变成背景下工做
! 逻辑运算意义上的『非』 not 的意思!
/ 路径分隔的符号
>, >> 输出导向,分别是『取代』与『累加』
' 单引号,不具备变量置换的功能
" 具备变量置换的功能!
` ` 两个『 ` 』中间为能够先执行的指令!
(   ) 在中间为子 shell 的起始与结束
[  ] 在中间为字符的组合
{   } 在中间为命令区块的组合!
组合按键 执行结果
Ctrl + C 终止目前的命令
Ctrl + D 输入结束(EOF),例如邮件结束的时候;
Ctrl + M 就是 Enter 啦!
Ctrl + S 暂停屏幕的输出
Ctrl + Q 恢复屏幕的输出
Ctrl + U 在提示字符下,将整列命令删除
Ctrl + Z 『暂停』目前的命令

8、连续指令的使用方式

这里须要再提几个重要的信息,咱们刚刚上面提过说,两个指令前后写在一块儿,能够这样写:
 
command1; command2
 
利用分号『 ; 』来分隔,这个分号的意思,表明不论 command1 执行结果为什么,command2 都会被执行!那么若是我是两个相关的指令,第一个 command1 若是执行结果有错误,第二个就不被执行,能够这样作吗?固然能够,就使用下面两个连结的咚咚:
 
command1 && command2
command1 || command2
 
还记得咱们以前的变量内容中,那个 ? 表明什么吗?没错,就是表明前一个执行的指令内容有没有错误,若是有错误就回传为 1 ,没有错误就回传为 0 ,你能够经由 echo $? 来查询得知。那么 && 就是表明,当 command1 执行结果传回值为 0 的时候,也就是没有错误讯息时,则 command2 才会开始执行,而 || 偏偏相反,当 command1 有错误讯息时, command2 才会执行!

9、命令重导向

a > b 表示将你目前的内容a重导向到b

除了这个 > 的符号以外,在 bash 命令执行的过程当中,主要有三种输出入的情况,分别是:
标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>

1> :是将正确的数据输出到指定的地方去
2> :是将错误的数据输出到指定的地方去

若是我须要将正确的数据和错误的数据分别输出到不一样的地方,能够以下指定

[test @test test]# find / -name testing 1> list_right 2> /dev/null

若是须要写到一个文件中

[test @test test]# find / -name testing 1> list 2> list  <==错误写法

[test @test tset]# find / -name testing 1> list 2>&1    <==正确写法

请特别留意这一点!同时写入同一个档案须要使用 2>&1 才对!

10、管道命令(pipe)

 bash 命令执行的时候有输出的数据会出现!那么若是这群数据必须要通过几道手续以后才能获得咱们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!

这个管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是 standard output ( STDOUT ) 的信息,对于 stdandard error 并无直接处理的能力。

在每一个管线的部分都是『指令』呢!然后一个指令的输入乃是由前一个指令的输出而来的!底下咱们来谈一谈一些基本的管线命令指令介绍:

cut
语法:

[root @test /root ]# cut -d "分隔字符" [-cf] fields
参数说明:
-d  :后面接的是用来分隔的字符,预设是『空格符』
-c  :后面接的是『第几个字符』
-f  :后面接的是第几个区块?
范例:
[root @test /root]# 
cat /etc/passwd | cut -d ":" -f 1 
将 passwd 这个档案里面,每一行里头的 : 
用来做为分隔号,而列出第一个区块!也就是姓名所在啦!
[root @test /root]# last | cut -d " " -f1  
以空格符为分隔,并列出第一个区间! 
[root @test /root]# last | cut -c1-20 
将 last 以后的数据,每一行的 1-20 个字符取出来!

sort
语法:

[root @test /root ]# sort [-t 分隔符] [(+起始)(-结束)] [-nru] 
参数说明: 
-t 分隔符:使用分隔符来隔开不一样区间,预设是 tab 
+start -end:由第 start 区间排序到 end 区间 
-n         :使用『纯数字』排序(不然就会以文字型态来排序) 
-r         :反向排序 
-u         :相同出现的一行,只列出一次! 
范例: 
[root @test /root]# cat /etc/passwd | sort 
将列出来的我的帐号排序! 
[root @test /root]# cat /etc/passwd | sort -t: +2n 
将我的帐号中,以使用者 ID 来排序(以 : 来分隔,第三个为 ID , 
但第一个代号为 0 之故)
[root @test /root]# cat /etc/passwd | sort -t: +2nr 
反相排序啰!

wc
语法:

[root @test /root ]# wc [-lmw] 
参数说明: 
-l   :多少行 
-m   :多少字符 
-w   :多少字

uniq
语法:

[root @test /root ]# uniq 
参数说明: 
范例: 
[root @test /root]# last | cut -d" " -f1 | sort | uniq

tr
语法:

[root @test /root ]# tr [-ds] SET1 
参数说明: 
-d  :删除 SET1 这个字符串 
-s  :取代掉重复的字符! 
范例: 
[root @test /root]# last | tr '[a-z]' '[A-Z]'         <==将小写改为大写 
[root @test /root]# cat /etc/passwd | tr -d :       <==嘿嘿! : 这个符号在 /etc/passwd 中不见了! 
[root @test /root]# cat /home/test/dostxt | tr -d '\r' > dostxt-noM   <==将 DOS 档案的字尾符号 ^M 的符号去除!

split
语法:

[root @test /root ]# split [-bl] 输入档案 输出档案前导字符 
参数说明: 
-b  :以档案 size 来分 
-l  :以行数来分 
范例: 
[root @test /root]# split -l 5 /etc/passwd test   <==会产生 testaa, testab, testac... 
等等的档案

管线命令在 bash 的连续的处理程序中是至关重要的!另外,在 log file 的分析当中也是至关重要的一环,因此请特别留意!