BASH

一、Bash与Shell

1. shell

  • 能够操作应用程序的接口的壳程序;

  • /bin/bash 是 linux 默认的 shell;

2. Bash Shell

  • 命令编修能力:~/.bash_history 记录前一次登陆以前所执行过的指令, 至于这一次登陆所执行的指令都被暂存在内存中,当你成功的登出系统后,该指令记忆才会记录到 .bash_history 当中;

  • 命令与文件补全功能:[Tab]按键;

  • 命令别名设置功能

    alias # 显示所有命令别名
    alias lm=‘ls -al’ # 设置命令别名
  • 工作控制、前景背景控制;

  • 程序化脚本:shell script;

  • 万用字符;

3. 查询是否为Bash shell内置命令

type [-tpa] name
不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内置指令
-t:当加入-t参数时,type 会将 name 以下面这些字眼显示出他的意义:
      file:表示为外部指令;
      alias:表示该指令为命令别名所设置的名称;
      builtin:表示该指令为 bash 内置的指令功能;
-p:如果后面接的 name 为外部指令时,才会显示完整文件名;
-a:会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias;

4. 指令的下达与快速编辑按钮

  • 使用 \ + [Enter] 可以跳行

  • [ctrl] + u 从光标处向前删除指令串, [ctrl] + k 向后删除指令串。

  • [ctrl] + a 让光标移动到整个指令串的最前面,[ctrl] + e 移动到最后面。

二、Shell的变量功能

1. 变量的取用、删除、设置

  • 变量的取用

    echo $变量名 或 ${变量名}
  • 变量的删除

    unset $变量名
  • 变量的设置

    变量名=变量内容 # 设置一个变量
    • 等号两边不能直接接空白字符;

    • 变量名称只能是英文字母与数字,开头字符不能是数字;

    • 变量内容有空白字符可以使用单引号与双引号,双引号内的特殊字符保持原有特性,单引号内的特殊字符仅为一个字符;

    • 可以使用跳脱字符 \ 将特殊符号([Enter]、$、\,空白字符等)变成一般字符;

    • 使用反单引号``或者$(指令)可以在一串指令中执行另一条指令;

    • 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容;

    • 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量;

    • 通常大写字符为系统默认变量,自行设置的变量使用小写字符;

2. 环境变量

  • 环境变量的内容

    • HOME:代表使用者的主文件夹;

    • SHELL:环境使用的SHELL是哪支程序;

    • HISTSIZE:记录历史命令的数量;

    • MALL:系统去读取邮件信箱文件;

    • PATH:可执行文件的搜寻路径;

    • LANG:语系数据;

    • RANDOM:产生一个随机数(0~32768);

  • 观察所有变量:set

    • PS1:提示字符的设置;

    • $:目前这个SHELL的线程代号(PID);

    • ?:关于上个执行指令的回传值,成功执行回传0;

    • OSTYPE、HOSTTYPE、MACHTYPE:主机硬件与核心的等级;

  • 自定变量转环境变量:export

    export 变量名称 #没有接环境变量就显示所有的环境变量
  • 语系变量

    locale -a #显示支持的所有语系
    • 设置LANG和LC_ALL时,其他语系变量就会被这两个取代;

    • /etc/locale.conf中存放系统默认语系;

  • 变量的有效范围:环境变量可以被子程序所引用,自定变量不会存在子程序中;

3. 变量键盘读取、阵列与宣告

  • read:读取来自键盘输入的变量;

    read [-pt] variable
    -p:后面可以接提示字符;
    -t:后面可以接等待的秒数;
  • declare/typeset:宣告变量类型;

    declare [-aixr] variable #不接任何参数显示所有变量
    -a:将后面名为 variable 的变量定义成为阵列 (array) 类型;
    -i:将后面名为 variable 的变量定义成为整数数字 (integer) 类型;
    -x:用法与 export 一样,就是将后面的 variable 变成环境变量;
    -r:将变量设置成为 readonly 类型,该变量不可被更改内容,也不能 unset;
    -p:单独列出变量类型;
    • 变量类型默认为字串;

    • bash环境中的数值运算默认最多仅能达到整数形态;

  • 阵列变量类型

    a[1]="one" 
    a[2]="two" #设置
    echo $a #读取 one two

4. 与文件系统及程序

ulimit [-SHacdfltu] [配额]
-H:hard limit ,严格的设置,必定不能超过这个设置的数值;
-S:soft limit ,警告的设置,可以超过这个设置值,但是若超过则有警告讯息。在设置上,通常 soft 会比 hard 小;
-a:后面不接任何选项与参数,可列出所有的限制额度;
-c:当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量;
-f:此 shell 可以创建的最大文件大小(一般可能设置为 2GB)单位为 KBytes;
-d:程序可使用的最大断裂内存(segment)容量;
-l:可用于锁定 (lock) 的内存量;
-t:可使用的最大 CPU 时间 (单位为秒);
-u:单一使用者可以使用的最大程序(process)数量;

5. 变量内容的删除、取代与替换

  • 变量内容的删除

    ${变量#关键字} #若变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除
    ${变量##关键字} #若变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除
    ${变量%关键字} #若变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除
    ${变量%%关键字} #若变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除
  • 变量内容的取代

    ${变量/旧字串/新字串} #若变量内容符合“旧字串”则“第一个旧字串会被新字串取代”
    ${变量//旧字串/新字串}	#若变量内容符合“旧字串”则“全部的旧字串会被新字串取代”
  • 变量的测试

    变量设置方式str 没有设置str 为空字串str 已设置非为空字串
    var=${str-expr}var=exprvar=var=$str
    var=${str:-expr}var=exprvar=exprvar=$str
    var=${str+expr}var=var=exprvar=expr
    var=${str:+expr}var=var=var=expr
    var=${str=expr}str=expr var=exprstr 不变 var=str 不变 var=$str
    var=${str:=expr}str=expr var=exprstr=expr var=exprstr 不变 var=$str
    var=${str?expr}expr 输出至 stderrvar=var=$str
    var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str

三、命令别名与历史命令

1. 命令别名设置

  • 查看命令别名

    alias
  • 设置命令别名

    alias 别名=指令
  • 取消命令别名

    unalias 别名

2. 历史命令

history [n]
history [-c]
history [-raw] histfiles
n :数字,意思是“要列出最近的 n 笔命令列表”的意思;
-c:将目前的 shell 中的所有 history 内容全部消除;
-a:将目前新增的 history 指令新增入 histfiles 中,若没有加 histfiles ,则默认写入 ~/.bash_history;
-r:将 histfiles 的内容读到目前这个 shell 的 history 记忆中;
-w:将目前的 history 记忆内容写入 histfiles 中;
!number #执行第几笔指令的意思
!command #由最近的指令向前搜寻“指令串开头为 command”的那个指令,并执行
!! #执行上一个指令

四、Bash Shell的操作环境

1. 路径与指令搜寻顺序

  • 以相对/绝对路径执行指令,例如“ /bin/ls ”或“ ./ls ”;

  • 由 alias 找到该指令来执行;

  • 由 bash 内置的 (builtin) 指令来执行;

  • 通过 $PATH 这个变量的顺序搜寻到的第一个指令来执行。

2. bash的进站与欢迎讯息

  • 本地登录:/etc/issue;

  • 远端登录:/etc/issue.net;

  • 提示信息:/etc/motd;

3. bash的环境配置文件

  • /etc/profile(只有login shell读):利用使用者的识别码 (UID) 来决定很多重要的变量数据,变量主要有PATH、MAIL、USER、HOSTNAME、HISTSIZE、umask;调用外部的设置数据;

  • ~/.bash_profile(只有login shell读):使用者的个人配置文件,并会调用~/.bashrc的设置内容;

  • ~/.bashrc(non-login shell会读):会调用/etc/bashrc文件;

  • source:读入环境配置文件的指令

    source 配置文件文件名
  • /etc/man_db.conf:规定了下达 man 的时候,该去哪里查看数据的路径设置;

  • ~/.bash_history:记录历史命令;

  • ~/.bash_logout:规定登出 bash 后,系统做完什么动作后才离开;

4. 终端机的环境设置

  • stty 可以设置终端机的输入按键代表意义;

  • set 可以设置整个指令输出/输入的环境;

5. 万用字符与特殊符号

字符:

  • *:代表“ 0 个到无穷多个”任意字符;

  • ?:代表“一定有一个”任意字符;

  • []:代表“一定有一个在括号内”的字符(非任意字符);

  • [-]:若有减号在中括号内时,代表“在编码顺序内的所有字符”;

  • [^]:若中括号内的第一个字符为指数符号 (^) ,那表示“反向选择”;

符号:

  • #:注解符号,这个最常被使用在 script 当中,视为说明!在后的数据均不执行;

  • \:跳脱符号,将“特殊字符或万用字符”还原成一般字符;

  • |:管线 (pipe),分隔两个管线命令的界定(后两节介绍);

  • ;:连续指令下达分隔符号,连续性命令的界定;

  • ~:使用者的主文件;

  • $:取用变量前置字符,亦即是变量之前需要加的变量取代值;

  • &:工作控制 (job control),将指令变成背景下工作;

  • !:逻辑运算非;

  • /:目录符号,路径分隔的符号;

  • ' ':不具有变量置换的功能 ($ 变为纯文本);

  • " ":具有变量置换的功能! ($ 可保留相关功能);

  • ``:中间为可以先执行的指令,亦可使用 $( );

  • ( ):在中间为子 shell 的起始与结束;

  • { }:在中间为命令区块的组合;

  • ">"、">>":数据流重导向,输出导向;

  • "<"、"<<":数据流重导向,输入导向;

五、数据流重导向

1. 相关概念

  • 标准输入standard input:将原本需要由键盘输入的数据,改由文件内容来取代,代码为 0 ,使用 < 或 << (控制结束的输入字符);

  • 标准输出standard output:指令执行所回传的正确的讯息,代码为 1 ,使用 > (覆盖)或 >> (累加);

  • 标准错误输出standard error output:指令执行失败后,所回传的错误讯息,代码为 2 ,使用 2> (覆盖)或 2>> (累加);

  • 垃圾桶黑洞设备/dev/null:可以吃掉任何导向这个设备的信息;

2. 命令执行的判断依据

  • 在指令与指令之间使用;分隔开,可以连续执行多条指令,指令与指令之间不考虑相关性;

  • $?:指令回传值,若前一个指令执行的结果为正确,在 Linux 下面会回传一个 $? = 0 的值;

  • 命令1 && 命令2:命令1正确执行才会执行命令2;

  • 命令1 || 命令2:命令1执行错误才会执行命令2;

六、管线命令

  • 管线命令仅会处理 standard output,对于 standard error output 会予以忽略

  • 管线命令必须要能够接受来自前一个指令的数据成为 standard input 继续处理才行。

1. 撷取命令

  • cut:主要的用途在于将同一行里面的数据进行分解;

    cut -d'分隔字符' -f fields
    cut -c 字符区间
    
    选项与参数:
    -d  :后面接分隔字符。与 -f 一起使用;
    -f  :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;
    -c  :以字符 (characters) 的单位取出固定字符区间;
  • grep:可以解析一行文字,取得关键字,若该行有存在关键字,就会整行列出来;

    grep [-acinv] [--color=auto] '搜寻字串' filename
    
    选项与参数:
    -a:将 binary 文件以 text 文件的方式搜寻数据;
    -c:计算找到 '搜寻字串' 的次数;
    -i:忽略大小写的不同,所以大小写视为相同;
    -n:顺便输出行号;
    -v:反向选择,亦即显示出没有 '搜寻字串' 内容的那一行;
    --color=auto:可以将找到的关键字部分加上颜色的显示喔;

2. 排序命令

  • sort:排序;

    sort [-fbMnrtuk] [file or stdin]
     
    选项与参数:
    -f:忽略大小写的差异,例如 A 与 a 视为编码相同;
    -b:忽略最前面的空白字符部分;
    -M:以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
    -n:使用“纯数字”进行排序(默认是以文字体态来排序的);
    -r:反向排序;
    -u:就是 uniq ,相同的数据中,仅出现一行代表;
    -t:分隔符号,默认是用 [tab] 键来分隔;
    -k:以那个区间 (field) 来进行排序的意思
  • uniq:想要将重复的数据仅列出一个显示;

    uniq [-ic]
    
    选项与参数:
    -i:忽略大小写字符的不同;
    -c:进行计数
  • wc:计算输出的讯息的整体数据;

    wc [-lwm]
    
    选项与参数:
    -l:仅列出行;
    -w:仅列出多少字(英文单字);
    -m:多少字符;

3. 双向重导向

  • tee:同时将数据流分送到文件去与屏幕 ;

    tee [-a] file
    
    选项与参数:
    -a:以累加 (append) 的方式,将数据加入 file 当中!

4. 字符转换命令

  • tr:可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换;

    tr [-ds] SET1 ...
    
    选项与参数:
    -d:删除讯息当中的 SET1 这个字串;
    -s:取代掉重复的字符;
  • col:将 [tab] 按键取代成为空白键;

    col [-xb]
    
    选项与参数:
    -x:将 tab 键转换成对等的空白键;
  • join:两个文件当中,有相同数据的那一行,才将他加在一起;

    join [-ti12] file1 file2
    
    选项与参数:
    -t:join 默认以空白字符分隔数据,并且比对“第一个字段”的数据,如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个;
    -i:忽略大小写的差异;
    -1:这个是数字的 1 ,代表“第一个文件要用那个字段来分析”的意思;
    -2:代表“第二个文件要用那个字段来分析”的意思;
  • paste:两个文件当中,有相同数据的那一行,将两行贴在一起,且中间以 [tab] 键隔开;

    paste [-d] file1 file2
    
    选项与参数:
    -d:后面可以接分隔字符。默认是以 [tab] 来分隔;
    -:如果 file 部分写成 - ,表示来自 standard input 的数据的意思;
    
  • expand:将 [tab] 按键转成空白键;

    expand [-t] file
    
    选项与参数:
    -t:后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代;

5. 分区命令

  • split:将一个大文件,依据文件大小或行数来分区,可以将大文件分区成为小文件;

    split [-bl] file PREFIX
    
    选项与参数:
    -b:后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
    -l:以行数来进行分区;
    PREFIX:代表前置字符的意思,可作为分区文件的前导文字。

6. 参数代换

  • xargs:读入 stdin 的数据,并且以空白字符或断行字符作为分辨,将 stdin 的数据分隔成为 arguments(参数);

    xargs [-0epn] command
    
    选项与参数:
    -0:如果输入的 stdin 含有特殊字符,例如\, 空白键等等字符时,这个 -0 参数可以将他还原成一般字符。这个参数可以用于特殊状态;
    -e:这个是 EOF (end of file) 的意思。后面可以接一个字串,当 xargs 分析到这个字串时,就会停止继续工作;
    -p:在执行每个指令的 argument 时,都会询问使用者的意思;
    -n:后面接次数,每次 command 指令执行时,要使用几个参数的意思;
    当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出;

7. 减号-的用途

  • 在管线命令当中,常常会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 "-" 来替代;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值