Linux shell常用命令总结2022

基础指令操作

  • . :代表此层目录,注意加cd跳转

  • .. :代表上一层目录

  • - :代表前一个工作目录

  • ~ :代表【目前用户身份】所在的家目录

  • ~account :代表account这个用户的家目录(account是账号名称)

  • alias:显示命令别名,如很多系统中vi=vim

    • alias 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就代表EOF

    cat << 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,不再显示该文件内容
    • bctrl + 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 :显示/打印变量值,在变量名称前面加上$,或者是以${变量} 的方式来取用都可以

变量的设定规则

  1. 变量与变量内容以一个等号【=】来连接,如name=zhangsan
  2. 等号两边不能直接接空格符
  3. 变量名称只能是英文字母与数字,但是开头字符不能是数字
  4. 变量内容若有空格符可使用双引号【"】或单引号【'】将变量内容结合起来
    a. 双引号内的特殊字符如$等,可以保有原来的特性。
    var="lang is $LANG"
    echo $var 可得 lang is zh_TW.UTF-8
    b. 单引号内的特殊字符则仅为一般字符(纯文本)
    var='lang is $LANG'
    echo $var 可得 lang is $LANG
  5. 可用跳脱/转义字符 \ 将特殊符号(如 enter、$、\ 空格、’ 等)变成一般字符
  6. 在一串指令的执行中,还需要藉由其他而外的指令所提供的信息时,可以使用反单引号‘指令’ 或 $(指令)
    a. version=$(uname -r)
    version=`uname -r`
    
    echo $version 可得 3.10.0-229.el7.x86_64
  7. 若该变量为扩增变量内容时,则可用 “$变量名称” 或 ${变量} 累加内容
  8. 若该变量需要在其他子程序执行,需要以 export 来使变量变成环境变量
    a. export PATH
  9. 通常大写字符为系统默认变量,自定设定变量可使用小写字符,方便判a断
  10. 取消变量的方法为使用 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 的:

  1. 内容与功能
  2. 版本信息
  3. 作者与联系方式
  4. 建档日期
  5. 历史记录
  6. 等等

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 ]

小案例,案例设定如下:

  1. 当执行一个程序的时候,这个程序会让用户选择 Y 或 N
  2. 如果用户输入 Y 或 y 时,就显示【Ok,continue!】
  3. 如果用户输入 n 或 N 时,就显示【Oh,interrupt!】
  4. 如果不是上面字符,就显示【 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%/*}" :获取当前路径(用%删除脚本名得到)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值