基础指令操作
-
.
:代表此层目录,注意加cd跳转 -
..
:代表上一层目录 -
-
:代表前一个工作目录 -
~
:代表【目前用户身份】所在的家目录 -
~account
:代表account这个用户的家目录(account是账号名称) -
alias
:显示命令别名,如很多系统中vi=vimalias name1='command'
:如 alias lm=‘ls -al | more’unalias name1
:取消别名
-
bc
:简单好用的计算器 -
cal
:显示日历cal [month] [year]
:显示指定年月的日历
-
cd change dir
:变换目录 -
chattr [+-=] [ASacdistu] 文件或目录名称
: -
chgrp [-R] 文件或目录
:改变文件所属群组 -R 表示递归持续变更 -
chown [-R] 账号名称:组名 文件或目录
:改变文件所有者 -
chmod [-R] 777 文件或目录
:改变文件权限 777表示所有者/群组/其他分别对应的rwx权限 -
cp [-R] 来源文件 目标文件
:复制文件 -R 表示递归持续变更 -
Ctrl+c
:中断当前程序 -
Ctrl+d
:键盘输入结束,相当于exit -
date
:显示日期与时间 -
declare
:定义变量的类型 -
df
: 列出文件系统的整体磁盘使用量df [-ahikHTm] [目录或文件名]
-a
:列出所有的文件系统,包括系统特有的 /proc 等文件系统-k
:以KBytes的容量显示各文件系统-m
:以MBytes的容量显示各文件系统-h
:以人们较易阅读的 GB、MB、KB 等格式自行显示-H
:以 M = 1000K 取代 M = 1024K 的进位方式-T
:连同该partition的filesystem名称例如(xfs)也列出-i
:不用磁盘容量,而以 inode 的数量来显示
df
:将系统内所有的 filesystem 列出来df -h
:将容量结果以易读的容量格式显示出来df -h /etc
:将 /etc 底下的可用的磁盘容量以易读的容量格式显示
-
du
du [-ahskm] 文件或目录名称
-a
:列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已-h
:以人们较易读的容量格式(G/M/K)显示-s
:列出总量而已,而不列出每个目录占用容量-S
:不包括子目录下的总计,与 -s 有点差别-k
:以 KBytes 列出容量显示-m
:以MBytes列出容量显示
du -sh *
:查看当前路径下各文件/子文件夹磁盘使用情况
-
env/export
:列出目前的shell环境下的所有环境变量与其内容 -
export 变量名
:自定义变量转成环境变量 -
EOF
:(END Of File)缩写,表示自定义终止符。在linux按ctrl+d就代表EOFcat << EOF # 开始 ...... # 输入内容 EOF # 结束
-
find [PATH] [option] [action]
:在指定路径下检索文件find /home -user user1
:搜寻 /home 底下属于 user1 的文件find / -name passwd
:找出名为 passwd 这个文件find / -name "*passwd*"
:模糊匹配find /dir1 /dir2 -name "*passwd*"
:可以指定多个路径find . -name "*passwd*" -exec ls -l {} \;
:模糊匹配后输出相应信息-exec command
:command为其他指令,-exec 后面可再接其他指令处理匹配到的结果{}
:代表 【由find找到的内容】,find的结果会放到 {} 中- -exec 一直到 ; 是关键词,代表find额外动作的开始到结束,中间就是额外指令 ,这里是
ls -l {}
- 因为
;
在bash环境下是有特殊意义的,因此利用反斜杠来跳脱
find / -size +1M
:找出系统中,大于 1MB 的文件
-
groupadd gname
:增加新的群组 -
history
:历史命令history [n]
history [-c]
history [-raw] histfiles
n
:数字,意思是【要列出最近的n笔命令行表】-c
:将目前的shell中的所有history内容全部消除-a
:将目前新增的 history 指令新增入 histfiles 中,若没有加hisfiles,则默认写入~/.bash_history
-r
:将 histfiles 的内容读到目前这个 shell 的 history 记忆中-w
:将目前的 history 记忆内容写入 histfiles 中history 3
:列出目前最近的3条命令
-
id uname
:查阅uname账号的属性 -
ln
:为某一个文件在另一个目录建立一个同步的链接,不会重复占用磁盘空间ln [参数] [源文件或目录] [目标文件或目录]
- 软链接(symbolic link):
- 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
- 软链接可以 跨文件系统,硬链接不行
- 软链接可以对一个不存在的文件名进行链接
- 软链接可以对目录进行链接
- 硬链接(hard link):
- 硬链接,以文件副本的形式存在。但不占用实际空间
- 不允许给目录创建硬链接
- 硬链接只有在同一个文件系统中才能创建
- 不论是硬链接还是软链接都不会将原来的档案复制一份,只会占用非常少量的磁盘空间
- 必要参数:
-b
:删除,不该以前建立的链接-d
:允许超级用户制作目录的硬链接-f
:强制执行-i
:交互模式,文件存在则提示用户是否覆盖-n
:把符号链接视为一般目录-s
:软链接(符号链接)-v
:显示详细的处理过程
- 选择参数
-S
-S <字尾备份字符串>
或--suffix=<字尾备份字符串>
-V
-V <备份方式>
或--version-control=<备份方式>
--help
:显示帮助信息--version
:显示版本信息
ln log2013.log ln2013
:为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同ln -s log2013.log link2013
:为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效
-
locale
:显示默认的语言字符集locale -a
:查看可用的语言环境locale [-ir] keyword
:利用数据路来搜寻文件名-i
:忽略大小写的差异-c
:不输出档名,仅计算找到的文件数量-l
:仅输出几行的意思,例如输出五行则是-l 5
-S
:输出locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等-r
:后面可接正则表达式的显示方式- 是由【已建立的数据库/var/lib/mlocate/】里面的数据所搜寻
-
ls
:文件与目录的检视ls [-aAdfFhilnrRSt] 文件名或目录名
ls [--color={never,auto,always}] 文件名或目录名称
ls [--full-time] 文件名或目录名称
-a
:全部的文件,连同隐藏档(开头为.的文件)一起列出来-A
:全部的文件,连同隐藏档,但不包括.
与..
这两个目录-d
:仅列出目录本身,而不是列出目录内的文件数据-f
:直接列出结果,而不进行排序(ls预设会以档名排序)-F
:根据文件、目录等信息,给予附加数据结构-h
:将文件容量以易读方式(GB/MB/KB/…)展示-i
:列出inode好吗-l
:长数据串输出,包含文件的属性与权限等等数据-n
:列出UID与GID而非使用者与群组的名称-r
:将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小-R
:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来-S
:以文件容量大小排序,而不是用档名排序-t
:依时间排序,而不是用档名--color=never
:不要依据文件特性给予颜色显示--color=always
:显示颜色--color=auto
:让系统自行依据设定来判断是否给予颜色--full-time
:以完整时间模式(包含年月日时分)输出--time={atime,ctime}
:输出access时间或改变权限属性时间ctime,而非内容变更时间modification time
-
lsattr [-adR] 文件或目录
:显示文件隐藏属性-a
:将隐藏文件的属性也秀出来-d
:如果接的是目录,仅列出目录本身的属性而非目录内的文件名-R
:连同子目录的数据也一并列出来
-
mkdir [-mp] 目录名称
:创建目录-m
:配置文件权限,例:mkdir -m 755 test
-p
:将所需要的目录(包含上级目录)递归建立
-
mv [-fiu] source destination
:移动文件与目录,或更名-f
:force强制的意思,如果目标文件已经存在,不会询问而直接覆盖-i
:若目标文件已经存在,会询问是否覆盖-u
:若目标文件已存在,且source比较新,才会更新(update)
-
netstat
:查询目前主机开启的网络服务端口netstat -a
:查看网络联机状态netstat -tuln
:取得目前主机已启动的服务netstat -nap | grep pid
:检索已知进程id使用的端口netstat -tunlp | grep port
:查看端口使用情况
-
ps -aux
:查看后台执行程序 -
pwd -P
:显示目前所在的目录 -P 显示出确实的路径,而非使用链接(link)路径 -
reboot、halt、poweroff
:重启 -
rm [-fir] 文件或目录
:删除谬或文件-f
:就是force的意思,忽略不存在的文件,不回出现警告讯息-i
:互动模式,在删除前会询问使用者是否确认-r
:递归删除,整目录删除
-
rmdir [-p] 目录名称
:删除目录(注意rmdir只能删除空的目录),-p 表示连同上层空目录级联删除 -
set
:查看所有变量(含环境变量和自定义变量),env升级版 -
shift+up
:向前翻页 -
shift+down
:向后翻页 -
shutdown
:关机 -
shutdown -h now
:立刻关机 -
shutdown -h 20:25
:系统在今天的20:25关机,如果当前时间大于20:25隔天关机 -
shutdown -h +10
:系统再过十分钟自动关机 -
shutdown -r now
:系统立刻重新启动 -
shutdown -r +30 'The system will reboot'
:再过30分钟系统会重新启动,并显示后面的讯息给所有在线的使用者 -
shutdown -k now 'This system will reboot'
:仅发出警告信件的参数!系统并不会关机 -
tee [-a] file
:同时将数据流分送到文件和屏幕-a
:以累加(append)的方式,将数据加入file当中
-
test -e /file1
:检查/file1是否存在-e
:该【文件】是否存在-f
:该【文件】是否存在且为文件(file)-d
:该【文件名】是否存在且为目录(directory)test -e /dmtsai && echo "exits" || echo "not exits"
:判断/dmtsai是否存在并对应输出
-
touch 文件名
:建立空文件 -
ulimit [-SHacdfltu] [配额]
:限制用户的某些系统资源-H
:hard limit,严格的设定,必定不能超过这个设定的数值-S
:soft limit,警告的设定,可以超过这个设定值,但是若超过则有警告讯息- 在设定上,通常soft会比hard小,举例来说,soft可设定为80
- 而hard设定为100,那么实际可使用到90(因为没有好过100),但介于80~100时,系统会有警告讯息通知
-a
:后面不接任何选项与参数,可列出所有的限制额度-c
:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除借用),这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。-f
:此shell可以建立的最大文件容量(一般可以设定为2GB)单位为Kbytes-d
:程序可使用的最大断裂内存(segment)容量-l
:可用于锁定(lock)的内存量-t
:可使用的最大 CPU 时间(单位为秒)-u
:单一用户可以使用的最大程序(process)数量ulimit -a
:列出你目前身份(假设为一般账号)的所有限制数据数值ulimit -f 10240
:限制用户仅能建立 10MBytes 以下的容量的文件
-
useradd -G gname uname
:建立uname账号,属于gname分组 -
whereis [-bmsu] 文件或目录名
:在一些特定的目录中寻找文件名-l
:可以列出whereis会去查询的几个主要目录-b
:只找 binary 格式的文件-m
:只找在说明文件 manual 路径下的文件-s
:只找 source 来源文件-u
:搜寻不在上述三个项目当中的其他特殊文件- whereis 只找几个特定目录,因此速度比 find 快
-
which [-a] command
寻找指令完整路径-a
:将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称
-
[command] --help
:显示命令帮助信息 -
man [命令]
:查看命令帮助文档 -
info [命令]
:查看指令详细内容 -
一般看信息都用查看man文档,而help只是一个简单的描述,方便,但man文档中都包含了
文件内容查阅
cat
:由第一行开始显示文件内容tac
:从最后一行开始显示,可以看出tac是cat的倒着写nl
:显示的时候,顺便输出行号more
:一页一页的显示文件内容- 空格键(space):代表向下翻一页
- Enter:代表向下翻一行
- /字符串:代表在这个显示的内容当中,向下搜寻【字符串】这个关键词
:f
:立刻显示出文件名以及目前显示的行数q
:代表立刻离开 more,不再显示该文件内容b
或ctrl + b
:代表往回翻页,不过这动作只对文件有用,对管线无用
less
:与more类似,但是比more更好的是它可以向前翻页- 空格键:向下翻动一页
- [pagedown] :向下翻动一页
- [pageup] :向上翻动一页
- /字符串 :向下搜寻【字符串】的功能
- ?字符串 :向上搜寻【字符串】的功能
- n :重复前一个搜寻(与 / 或 ?搭配用)
- N :反向的重复前一个搜寻(与 / 或 ?搭配用)
- g :前进到这个资料的第一行
- G :前进到这个数据的最后一行去
- q :离开less这个程序
head [-n number] 文件
:只看头几行-n
:后面接数字,代表显示几行的意思
tail [-n number] 文件
:只看尾巴几行-n
:后面接数字,代表显示几行的意思tail -n +100 文件
:列出文件100行以后的数据tail -f 文件
:持续侦测文件内容
od
:以二进制的方式读取文件内容
压缩(略,有需要可看鸟哥第八章)
vim
vim共分为三种模式
- 一般指令模式(command mode):vi打开文件就是这个模式
- 编辑模式(insert mode):按下【i,I,o,O,a,A,r,R】等任何一个字母之后才会进入编辑模式,ESC退出回到一般模式
- 指令行命令模式(command-line mode):一般模式时输入【: / ?】三个中的任何一个按钮进入
简单执行范例:
- 使用
vi filename
进入一般指令模式 - 按下 i 进入编辑模式,开始编辑文字
- 按下 ESC 按钮回到一般指令模式
- 按下 : 进入指令行模式,wq 文件保存并离开 vi 环境
一般指令模式常用指令:
- 移动光标的方法
- 小键盘上下左右…
- ctrl + f :屏幕向下移动一页
- ctrl + b :屏幕向上移动一页
- ctrl + d :屏幕向下移动半页
- ctrl + u :屏幕向上移动半页
n<space>
:n表示数字,例如20,按下数字后再按下空格,光标会向右移动这一行的20个字符- 0 或 功能键Home :移动到这一行的最前面字符处
- $ 或 功能键End :移动到这一行的最后面字符处
- gg :移动到这个文件第一行
- G :移动到这个文件的最后一行
- nG :n为数字。移动到这个文件的第n行
n<Enter>
:n 为数字。光标向下移动 n 行
- 搜寻与取代
/word
:向光标之下寻找一个名称为word的字符串?word
: 向光标之上寻找一个名称为word的字符串- n :代表【重复前一个搜寻动作】,如继续查找
- N :与 n 相反,为【反向进行前一个搜寻动作】
- 使用 /word 配合 n 及 N 是非常有帮助的,可以让你重复的找到一些你搜寻的关键词
:n1,n2s/word1/word2/g
:n1 与 n2 位数字,在 n1 与 n2 行之间寻找word1这个字符串,并将该字符串取代为word2:1,$s/word1/word2/g
:从第一行到最后一行寻找word1字符串,并将该字符串取代为word2:1,$s/word1/word2/gc
:从第一行到最后一行寻找word1字符串,并将该字符串取代为word2,且在取代前显示提示字符给用户确认是否需要取代
- 删除、复制与贴上
x, X
:在一行字当中,x为向后删除一个字符(相当于【del】),X为向前删除一个字符(相当于【backspace】)nx
:连续向后删除n个字符dd
:删除游标所在的那一整行ndd
:删除光标所在的向下n行d1G
:删除光标所在到第一行的所有数据dG
:删除光标所在到最后一行的所有数据yy
:复制游标所在的那一行p, P
:p为将已复制的数据在光标下一行贴上,P则为贴在游标上一行u
:复原前一个动作(撤销)ctrl + r
:重做上一个动作(回退).
:重复前一个动作
指令列模式常用指令:
- 储存、离开等指令
:w
:将编辑的数据写入硬盘文件中:w!
:若文件属性为【只读】时,强制写入该文件。是否成功与该文件的文件权限有关:q
:离开vi:q!
:若曾修改过文件,又不想储存,使用!为强制离开而不储存文件:wq
:储存后离开,若为:wq!
则为强制储存后离开ZZ
:大写的Z,若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开:w [filename]
:将编辑的数据储存成另一个文件(类似另存档)
- vim 环境的变更
:set nu
:显示行号,设定之后,会在每一列的前缀显示该列的行号:set nonu
:与 set nu 相反,取消行号
shell
我们通过 【Shell】将我们输入的指令与Kernel沟通,好让Kernel可以控制硬件来正确无误的工作
/bin/bash 是 linux 预设的 shell
echo $variable
:显示/打印变量值,在变量名称前面加上$,或者是以${变量}
的方式来取用都可以
变量的设定规则
- 变量与变量内容以一个等号【=】来连接,如name=zhangsan
- 等号两边不能直接接空格符
- 变量名称只能是英文字母与数字,但是开头字符不能是数字
- 变量内容若有空格符可使用双引号【"】或单引号【'】将变量内容结合起来
a. 双引号内的特殊字符如$等,可以保有原来的特性。
var="lang is $LANG"
则echo $var
可得lang is zh_TW.UTF-8
b. 单引号内的特殊字符则仅为一般字符(纯文本)
var='lang is $LANG'
则echo $var
可得lang is $LANG
- 可用跳脱/转义字符
\
将特殊符号(如 enter、$、\ 空格、’ 等)变成一般字符 - 在一串指令的执行中,还需要藉由其他而外的指令所提供的信息时,可以使用反单引号‘指令’ 或
$(指令)
a.version=$(uname -r)
同
再version=`uname -r`
echo $version
可得3.10.0-229.el7.x86_64
- 若该变量为扩增变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容
- 若该变量需要在其他子程序执行,需要以 export 来使变量变成环境变量
a.export PATH
- 通常大写字符为系统默认变量,自定设定变量可使用小写字符,方便判a断
- 取消变量的方法为使用
unset
a.unset myname
数组变量的设定方式:var[index]=content
[dmtsai@study ~]$ var[1]="samll min"
[dmtsai@study ~]$ var[2]="big min"
[dmtsai@study ~]$ var[3]="nice min"
[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"
samll min, big min, nice min
变量内容的删除与替换
echo ${path#/*local/bin:}
:删除path变量中第一个带local/bin的路径(下面删除线部分)
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin#
代表【从变量内容的最前面开始向右删除】,且仅删除最短的那个*
通配符*指代0到无穷多个任意字符
echo ${path#/*:}
:效果同上
echo ${path##/*:}
:一个#变成##后,变成【删除掉最长的那个数据】(下面删除线部分)
/usr/local/bin: /usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
如果想要【从后面向前删除变量内容】时候就得使用百分比(%)符号了
echo ${path%:*bin}
:(下面删除线部分,要包含:号,这里语法问题没包含)
/usr/local/bin: /usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
echo ${path%%:*bin}
:%%代表的则是最长的符合字符串
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
echo ${path/sbin/SBIN}
:将path的变量内容内的第一个sbin取代成大写SBIN
echo ${path//sbin/SBIN}
:两条斜线,代表将所有符合的内容都取代
变量内容替换(略,后续补充)
- new_var=${old_var-content} :若old_var变量为设定或为空字符串,则将new_var内容设定为content
- …
/etc/profile
:系统整体的设定,最好不要修改这个文件
~/.bash_profile
或 ~/.bash_login
或 ~/.profile
:属于使用者个人设定,你要改自己的数据,就写入这里
bash 的 login shell 后:
- 首先读取整体环境配置文件 /etc/profile
- 然后读取其他的配置文件 /etc/profile.d/*.sh、/etc/locale.conf 等
- 接下来会读取使用者的个人配置文件,依序分别是:
~/.bash_profile
~/.bash_login
~/.profile
- bash 的 login shell 设定只会读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序。也就是说,如果
~/.bash_profile
存在,那么其他两个文件不论有无存在,都不会被读取
source 配置文件名:读取环境配置文件的指令
- 因为配置文件是 login shell 时读取的,所以更改后需要注销重登陆才会生效,也可以通过source来重新读取
bash默认组合键:
- ctrl + c :中止目前的命令
- ctrl + d :输入结束(EOF),例如邮件结束的时候
- ctrl + m :就是Enter
- ctrl + s :暂停屏幕的输出
- ctrl + q :恢复屏幕的输出
- ctrl + u :在提示字符下,将整列命令删除
- ctrl + z :【暂停】目前的命令
通常的通配符
*
:代表【0个到无穷多个】任意字符?
:代表【一定有一个】任意字符[]
:同样代表【一定有一个在括号内】的字符(非任意字符)。例如[abcd]
代表【一定有一个字符,可能是a, b, c, d这四个任何一个】[-]
:若有减号在中括号内,代表【在编码顺序内的所有字符】。例如[0-9]
代表0-9之间的所有数字,因为数字的语系编码是连续的[^]
:若中括号内的第一个字符为指数符号(^),表示【反向选择】,例如[^abc]
代表一定有一个字符,只要是非a, b, c的其他字符都可以
例:
ll -d /etc/cron*
:找出/etc下以cron为开头的文件ll -d /etc/?????
:找出/etc下文件名【刚好是五个字符】的文件名ll -d /etc/*[0-9]*
:找出/etc下文件名含有数字的文件名ll -d /etc/[^a-z]*
:找出/etc下文件名开头非小写字母的文件名mkdir /tmp/upper; cp -a /etc/[^a-z]* /tmp/upper
:将上面找到的文件复制到 /tmp/upper 中
bash 环境中的特殊符号
#
:注释符号\
:跳脱/转义符号|
:管线(pipe),分割两个管线命令的界定;
:连续指令下达分隔符,连续性命令的界定~
:用户的家目录$
:变量前导符&
:工作控制(job control),将指令变成背景下工作!
:逻辑运算意义上的【非】/
:目录符号,路径分隔的符号>,>>
:数据流重导向,输出导向,分别是【取代】与【累加】<,<<
:数据流重导向,输入导向''
:单引号,不具有变量置换的功能""
:具有变量置换的功能``
:两个 ` 中间为可以先执行的指令,亦可使用 $()()
:在中间为子 shell 的起始于结束{}
:在中间为命令区块的组合
数据流重导向
传送所用的特殊字符:
- 标准输入(stdin):代码为0,使用 < 或 <<
- 标准输出(stdout):代码为1,使用 > 或 >>
- 标准错误输出(stderr):代码为2,使用 2> 或 2>>
- 1> :以覆盖的方法将【正确的数据】输出到指定的文件或装置上
- 1>> :以累加的方法将【正确的数据】输出到指定的文件或装置上
- 2> :以覆盖的方法将【错误的数据】输出到指定的文件或装置上
- 2>> :以累加的方法将【错误的数据】输出到指定的文件或装置上
/dev/null 垃圾桶黑洞装置与特殊写法,这个 /dev/null 可以吃掉任何导向这个装置的信息
2>&1 / &> :两种写法均可,将正确与错误数据通通写入同一个文件
standard input:< 与 <<
- 将原本需要由键盘输入的数据,改由文件内容来取代
练习:
|| /
:此时屏幕会显示跟目录文件名信息|| / > ~/rootfile
:屏幕无输出,输出数据已经被重导向到 ~/rootfile 文件中,使用cat查看可以发现和上面输出一样find /home -name .bashrc > list_right 2> list_error
:将stdout与stderr分存到不同的文件find /home -name /bashrc 2> /dev/null
:将错误的数据丢弃,屏幕上只显示正确的数据find /home -name /bashrc > list 2>&1
:将指令的数据(stdout 与 stderr)全部写入list文件find /home -name /bashrc &> list
:同上- 注意,右边这么写会报错,必须按照上面的格式写:
find /home -name /bashrc > list 2> list
- 由于两股数据同时写入一个文件,又没有使用特殊的语法,此时两股数据可能会交叉写入该文件内,造成次序的错乱
命令执行的判断依据: ; && ||
cmd; cmd
:指令与指令中间利用分号隔开,这样一来,分号前的指令执行完后就会立刻接着执行后面的指令了cmd1 && cmd2
:- 若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
- 若cmd1执行完毕且为错误($?!=0),则cmd2不执行
cmd1 || cmd2
- 若cmd1执行完毕且正确执行($?=0),则cmd2不执行
- 若cmd1执行完毕且为错误($?!=0),则开始执行cmd2
例:
ls /tmp/abc && touch /tmp/abc/hehe
:使用ls查阅 /tmp/abc 是否存在,若存在则用touch建立 /tmp/abc/hehe ,如果目录不存在,会发现只有前半段的报错,后半段不会执行ls /tmp/abc || mkdir /tmp/abc
:测试路径是否存在,若不存在则建立,若存在不做任何事情ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
:我不清楚 /tmp/abc 是否存在,但就是要建立 /tmp/abc/hehe 文件
管线命令pipe(|)
在每个管线后面接的第一个数据必定是【指令】!而且这个指令必须要能够接受 standard input 的数据才行,这样的指令才可以是为【管线命令】,例如 less,more,head,tail 等都是可以接受 standard input 的管线命令。至于利于 ls,cp,mv 等就不是管线命令,因为 ls,cp,mv并不会接受来自 stdin 的数据。也就是说,管线命令主要有两个比较需要注意的地方:
- 管线命令仅会处理 stanard output,对于 starndard error output 会予以忽略
- 管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行
cut
:切分字符串
-
cut -d '分隔字符' -f fields
:用于有特定分隔字符 -
cut -c 字符区间
:用于排列整齐的讯息-d
:后面接分隔字符。与 -f 一起使用-f
:依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思-c
:以字符(characters)的单位取出固定字符区间
-
echo ${PATH} | cut -d ':' -f 5
:将环境变量PATH的值以:
分隔,输出第五部分- /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
-
echo ${PATH} | cut -d ':' -f 3-5
:将环境变量PATH的值以:
分隔,输出三到五部分- /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
-
echo ${PATH} | cut -d ':' -f 3,5
:将环境变量PATH的值以:
分隔,输出三到五部分- /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin
-
export | cut -c 12-
:将export输出的讯息,取得第12字符以后的所有字符串~ root$ export declare -x PWD="/Users/lixiang/Desktop" declare -x SHELL="/bin/bash" declare -x SHLVL="1" # 注意看,每个数据都是排列整齐的输出,如果我们不想要【declare -x】时,就得这么做 ~ root$ export | cut -c 12- PWD="/Users/lixiang/Desktop" SHELL="/bin/bash" SHLVL="1"
grep
:分析一行讯息,若当中有我们所需要的信息,就将该行拿出来
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a
:将binary 文件以 text 文件的方式搜寻数据-c
:计算找到 ‘搜索字符串’ 的次数-i
:忽略大小写的不同,所以大小写视为相同-n
:顺便输出行号-v
:反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行--color=auto
:可以将找到的关键词部分加上颜色的显示
history | grep "test"
:取出历史命令中带test的记录history | grep -v "test"
:取出历史命令中不带test的记录history | grep "test" | cut -d ' ' -f 5
:取出历史命令中带test的记录以’ '切分取第五列
排序命令:sort,wc,uniq
sort 语法:sort [-fbMnrtuk] [file or stdin]
-f
:忽略大小写的差异-b
:忽略最前面的空格符部分-M
:以月份的名字来排序,例如JAN,DEC等等的排序方法-n
:使用【纯数字】进行排序(默认是以文字形态来排序的)-r
:反向排序-u
:就是 uniq,相同的数据中,仅出现一行代表-t
:分隔符,预设是用【tab】键来分隔-k
:以哪个区间(field)来进行排序的意思
sort demo:
cat /etc/passwd | sort
:对记录在/etc/passwd下的账号进行排序cat /etc/passwd | sort -t ':' -k 3
:/etc/passwd 内容是以:
来分隔的,以第三栏来排序last | cut -d ' ' -f1 | sort
:利用last,将输出的数据仅取账号,并加以排序
uniq 语法:uniq [-ic]
-i
:忽略大小写字符的不同-c
:进行计数
uniq demo:
last | cut -d ' ' -f 1 | sort | uniq
:使用last将账号列出,仅列出账号栏,进行排序后仅取出第一位last | cut -d ' ' -f 1 | sort | uniq -c
:如上,同时输出每个人的登入总次数
wc 语法:wc [-lwm]
-l
:仅列出行-w
:仅列出多少字(英文单字)-m
:多少字符
wc demo:
cat /etc/man_db.conf | wc
:输出三个数字,分别对应文件【行、字数、字符数】
xargs:参数代换,xargs 可以读入 stdin 的数据,并且以空格符或断行字符将 stdin 分隔成为 arguments
语法:xargs [-0epn] command
-0
:如果输入的stdin含有特殊字符,例如 ` , \ 空格等,这个-0参数可以将他还原成一般字符-e
:这个是EOF(end of file)的意思。后面可以接一个字符串,当 xargs 分析到这个字符串时,就会停止继续工作-p
:在执行每个指令的 argument 时,都会询问使用者的意思-n
:后面接次数,每次 command 指令执行时,要使用几个参数的意思- 当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出
demo:
find . -name "*.txt" | xargs grep "111"
:当前路径下查找所有文本内容中带111的txt文件
第十一章 正则表达式(暂略)
shell scripts
第一行 #! /bin/bash
在宣告这个 script 使用的 shell 名称,宣告这个文件内的语法使用 bash 的语法,能够加载 bash 的相关环境配置文件
建议你一定要养成写文件头注释说明该 script 的:
- 内容与功能
- 版本信息
- 作者与联系方式
- 建档日期
- 历史记录
- 等等
var=$((运算内容))
echo $((13%3))
:输出余数1
乘法计算器:
#! /bin/bash
# Program:
# User inputs 2 integer numbers; program will cross these two numbers
# History
# 2022/10/22
echo -e "You should input 2 numbers, I will multiplying them:\n"
read -p "first number:" firstnum
read -p "second number:" secnum
total=$((${firstnum}*${secnum}))
echo -e "\nThe result of ${firstnum} x ${secnum} is ==> ${total}"
shell script 下特殊变量说明:
$$
:shell 本身的PID(ProcessID)$!
:shell最后运行的后台Process的PID$?
:最后运行的命令的结束代码(返回值)$-
:使用 Set 命令设定的 Flag 一览$*
:所有参数列表。如 “$*” 用"
括起来的情况,以" $1 $2 $3 $4 $5 "
$@
:所有参数列表。如 “$@” 用"
括起来的情况,以"$1" "$2" "$3" "$4" "$5 "
@#
:添加到shell的参数个数$0
:shell 本身的文件名$1 ~ $n
:添加到 shell 的各参数值。$1 时第一参数,$2 是第二参数
利用判断符号 []
[ -z "${HOME}" ]; echo $?
:存在输出1,不存在输出0- 在中括号
[]
内的每个组件都需要有空格来分隔 - 在中括号内的变数,最好都以双引号括起来
- 在中括号内的常数,最好都以单或双引号括起来
-o
表示判断中 或 关系:[ condition1 -o condition2 ]
- 在中括号
小案例,案例设定如下:
- 当执行一个程序的时候,这个程序会让用户选择 Y 或 N
- 如果用户输入 Y 或 y 时,就显示【Ok,continue!】
- 如果用户输入 n 或 N 时,就显示【Oh,interrupt!】
- 如果不是上面字符,就显示【 I don’t know what your choice is 】
#! /bin/bash
read -p "Please input(y/n):" input1
[ "${input1}" == "Y" -o "${input1}" == "y" ] && echo "OK,continue!" && exit 0
[ "${input1}" == "N" -o "${input1}" == "n" ] && echo "Oh,interrupt!" && exit 0
echo "I don't know what your choice is" && exit 0
条件判断式
利用 if ...... Then
-
单层、简单条件判断式
if [ 条件判断式 ]; then cmd # 当条件判断式成立时,可以进行的指令工作内容 fi # 将if反过来写,代表结束if
-
多重、复杂条件判断式
# 多个条件判断 (if ... elif ... elif ... else)分多种不同情况执行 if [ 条件判断式一 ]; then cmd1 #当条件判断式一成立时,可以进行的指令工作内容 elif [ 条件判断式二 ]; then cmd2 #当条件判断式二成立时,可以进行的指令工作内容 else cmd3 #判断式一二都不成立时执行 fi
则前面的案例可更改为:
#! /bin/bash
read -p "Please input(y/n):" input1
if [ $input1 == "Y" ] || [ $input1 == "y" ]; then
echo "OK,continue!"
elif [ $input1 == "N" ] || [ $input1 == "n" ]; then
echo "Oh,interrupt!"
else
echo "I don't know what your choice is"
fi
也可以改为脚本传参的方式:
#! /bin/bash
if [ $1 == "Y" ] || [ $1 == "y" ]; then
echo "OK,continue!"
elif [ $1 == "N" ] || [ $1 == "n" ]; then
echo "Oh,interrupt!"
else
echo "I don't know what your choice is"
fi
利用 case ...... esac
判断(暂略,类似switch)
函数(function)
定义并调用 function demo:
#! /bin/bash
function printinfo(){
echo "your choice is $1"
}
echo "this program will print your selection!"
case $1 in
"one")
printinfo 1
;;
"two")
printinfo 2
;;
"three")
printinfo 3
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
循环(loop)
常规语法:
while [ condition ] # 中括号内的状态就是判断式
do # do 是循环的开始
程序段落
done # done 是循环的结束
类 do-while 语法
until [ condition ]
do
程序段落
done
for ... do ... done
(固定循环):已经知道要进行几次循环
语法:
for var in con1 con2 con3 ...
do
程序段
done
# for ... do ... done 的数值处理
除了上述的方法之外,for 循环还有另外一种写法!语法如下:
for (( 初始值; 限制值; 执行步阶 ))
do
cmd #程序段
done
其他
uname -r
:获取当前机器内核版本
${BASH_SOURCE-$0}
:获取脚本名称
$(readlink -f "$0")
:获取当前脚本的绝对路径
SCRIPT_PATH=$(readlink -f "$0"); CURRENT_DIR="${SCRIPT_PATH%/*}"
:获取当前路径(用%删除脚本名得到)