第32周-鸟哥的Linux私房菜基础篇第三版-第十一章 认识与学习BASH

1、中介模型:硬件、kernel、使用者:


2、shell功能:提供用户操作系统的接口,需要可以呼叫其他软件,如man、mkfs都是应用程序;
3、/bin/sh (已经被 /bin/bash 所取代)
 /bin/bash (就是 Linux 预备的 shell)
 /bin/ksh (Kornshell 由 AT&T Bell lab. 发展出来的,兼容亍 bash)
 /bin/tcsh (整合的 C Shell ,提供更多的功能)
 /bin/csh (已经被 /bin/tcsh 所取代)
 /bin/zsh (基亍 ksh 发展出来的,功能更强大的 shell)
4、命令编修能力history:能记忆使用过的指令,被放在家目录的.bash_history;
   注意:~/.bash_history记录的是前一次登入以前所执行过的指令,而本次的则暂存在内存,需注销系统后才会被记录。(黑客入侵,若指令与系统有关,其直接输入MySQL的密码在指令列上面)
5、tab:命令与档案补全;
6、命令别名设定功能:alias
      如:alias lm=‘ls -al’ 这样以后只输入lm就相当于在使用ls -al;
7、工作控制、前景与背景控制;
8、程序化脚本:shell scripts;
9、通配符:*
     如 ls /usr/bin/ABC*
10、Bash shell的内建命令:type   可查看指令是来自内建还是外部
      man bash     查看bash的说明文件,很重要
      type [-tpa] name  (t显示意义如file外部指令,alias别名,builtin内建指令;p外部则显示完整名;将含有name的指令都列出);
      例: type ls
           type -t ls
           type -a ls
           type cd
11、环境变量:用来读入系统中,系统需要这些变量提供数据的存取。如PATH、HOME、MAIL、SHELL等。
12、变量的取用与设定:echo
      变量取用前需要用【$】的符号;
    例:echo $variable
        echo $PATH
        echo ${PATH}
        echo ${HOME}
        echo $myname
        myname=Shawn
        echo $myname
13、变量设定规则:

   a、变量=两边不能有空格,C语言则可;
   b、开头不能是数字;
   c、变量需空格,则用"",可保留原本特性,''为纯文本;
   d、反单引号指令【`】(1左边键),在【`】之内的指令会被先执行;
   e、扩增变量用“$+变量名”:【PATH="$PATH":/home/bin】;
   f、变量变成环境变量(才可在其他子程序执行):【export PATH】;
   g、取消变量:【unset myname】
  例:
      name=Shawn\'s \name (反斜杠\跳脱特殊字符,可忽略单引号和空格)
      name="$name"yes
      name=${name}yes 
  例:设定变量用在下个shell中
        name=Shawn
        export name
        bash
        echo $name
        exit
      概念:父程序(当前程序)——子程序(启用另一个程序)——父程序的自定义变量无法再子程序中


应用,需要加上export,从变量改为环境变量。


14、取得核心版本信息指令:uname -r
      name=Shawn
      echo $name
      myname="$name its me"  此处的$name相当于是C语言中的%s
      echo $myname
      myname='$name it's me'  
      echo $myname
    设定常用变量目录,避免出错,和减少每次输入时间
    例:work="/cluster/server/work/xiamen_2016/11/6"
        cd $work
15、选用的变量赋值方式:version=${uname -r} 
    不选用:            version=`uname -r`  因为【`】容易看错。
16、shell默认的环境变量查询:env和export
      TERM         终端使用的环境类型
      SHELL        当前环境下,使用的Shell是哪一个程序
      HISTSIZE     记录命令笔数,默认为1000
      MAIL         用户取用的mailbox位置,使用mail,系统将读取邮件信箱档案mailbox
      PATH         执行文件指令搜寻路径
      LANG         语系
      RANDOM       随机随机数,默认0-32767,就是/dev/random这个档案
      PWD          工作目录
      HOME         家目录
      _=/bin/env   上次使用指令的最后一个参数
    例:生成随机0-9的数值,declare -i number=$RANDOM*10/32768;echo $number
        知识点:declare (为宣告数值类型)
17、set:观察所有变量(含环境变量与自定义变量)
       a、PS1          提示字符的设定
          符号意义:
              o \d :可显示出『星期 月 日』癿日期格式,如:"Mon Feb 2"
              o \H :完整的主机名。丼例杢说,鸟哥的练习机为『www.vbird.tsai』
              o \h :仅取主机名在第一个小数点之前的名字,如鸟哥主机则为『www』后面省略
              o \t :显示时间,为 24 小时格式癿『HH:MM:SS』
              o \T :显示时间,为 12 小时格式癿『HH:MM:SS』
              o \A :显示时间,为 24 小时格式癿『HH:MM』
              o \@ :显示时间,为 12 小时格式癿『am/pm』样式
              o \u :目前使用者的账号名称,如『root』;
              o \v :BASH 的版本信息,如鸟哥癿测试主板本为 3.2.25(1),仅取『3.2』显示
              o \w :完整的工作目录名称,由根目录写起的目录名称。但家目录会以 ~ 取代;
              o \W :刟用 basename 凼数叏得工作目录名称,所以仅会列出最后一个目录名。
              o \# :下达得第几个指令。
              o \$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $ 啰~
           例:PS1='[\u@\h \w \A #\#]\$'
         b、$:本shell的PID,即线程代号
           例:显示线程代号  echo $$
         c、?:指上一个执行指令所传回的值,执行成功传回0,否则为【错误代码】,即非0数值。
         d、OSTYPE,HOSTTYPE,MACHTYPE:主机硬件与核心的等级
         e、export:自定义变量转成环境变量
              父程序与子程序概念:第一个bash父程序,触发子程序,原父程序睡着;
                                  子程序需要exit或logout将其结束掉方可回到父程序;
              理解模型:实线虚线图形
         f、影响显示结果的语系变量(locale):
               locale -a
               locale
            语系档案位置: /usr/lib/locale/  
            整体系统默认的语系定义位置:/etc/sysconfig/i18n  执行结果表明没有?
            big5:大五码
            utf8:万国码  若从windows将文档转到Linux上出现乱码,可更改大便干的软件编码。
18、变量的有效范围:
        环境编程=全局变量global;(类似C语言的定义)  
        自定义变量=局部变量local
        问题核心:内存配置的关系
19、变量键盘读取、数组与宣告:read、array、declare
        a、read [-pt] varible  提示字符/等待秒数
           例1:read atest 
               Hello World   
               echo $atest
               Hello World
           例2:read -p "Please keyin your name:" -t 30 named
20、declare [-aixr] variable   a数组/i整型/x变成环境变量/r只读设定
       bash对变量的基本定义:A、默认为字符串,所以需要指定变量类型;
                             B、bash环境的数值运算,预设最多仅能达到整数形态。
       例1:sum环境变量:
              declare -x sum
              export |grep sum
       例2:只读:declare -r sum    
       例3:将sum变成非环境变量的自定义变量
              declare +x sum   将-变为+,可进行取消动作
              declare -p sum   单独列出变量类型
    数组变量类型:
       数组的设定方式:
              var[index]=content
          例:var[1]="small min"
              var[2]="bing min"
              var[3]="nice min"
              echo "${var[1]},${var[2]},${var[3]}"
21、与文件系统及程序的限制关系:ulimit   
       ulimit [-SHacdfltu] 配额       S严格/H警告/a列出所有限额/c错误写成档案/f最大档容/d最大断裂内存容量/l锁定内存量/t最大CPU时间/单用户最大程序数量
    例1:ulimit -a 
         ulimit -f 10240  仅能建立10MB容量档案
         dd if=/dev/zero of=123 bs=1M count=20  结果会失败,因为超过了设置限度。
    注意:一般身份,只能继续减小档案容量,而不能增加容量,若要管控ulimit,可用pam。
22、变量内容的删除、取代与替换:
       删除目录范围:从【/】到【:】之间
       #:           最短那个;
       ##:          最长那个。
       %:           最后面开始删除  
       %%:          只留第一个目录


   例:先用path自定义变量设定与PATH相同
      path=${PATH}
      echo $path
      echo ${path#/*local/bin:}  删除从左边开始到/bin的内容
      echo ${path#/*:}   #从前面开始删
      echo ${path##/*:}  仅剩最后一个
      echo ${path%:*bin}
      echo ${path%%:*bin} 
   例:有变量MAIL,位置在/var/spool/mail/root,欲删掉仅剩/root
         echo ${MAIL##/*/}
       若仅删/root
         echo ${MAIL%/*}
   取代:
      echo ${path/sbin/SBIN}   两/间为旧,后面为新
      echo ${path//sbin/SBIN}  所有符合的内容都将被取代
   变量的测试与内容替换:new_var=${old_var-content}
    例1:判断变量username是否存在,若不存在给予内容root。
      echo $username
      username=${username-root}
      echo $username
      username="Shawn"
      username=${username-root}
      echo $username
    例2:user未设定或为空字符串,将其设定为root。
         username=""
         username=${username-root}   【-】后面接关键字
         echo $username
         username=${username:-root}   加上【:】后若变量内容为空或未设定,后面内容将替换
         echo $username


23、命令别名设定:alias,unalias
      例:简化命令
             alias lm='ls -al | more'  相当于lm代替了后面的指令
          查看目前的指令别名:
             alias
          移出指令:
             unlias
          DOS时期指令表示:清屏、列出目录档案,
             alias cls='clear'
             alias dir='ls -l'
24、历史命令:history
        history [n]                  n笔指令
        history [-C]                 清除所有histfiles,
        history [-raw] histfiles     r将读到的写入记忆/增入histfiles,若无则写入~/.base_history/记忆写入histfiles,强行写入
        例1:history
            history 5
            history -w 
            echo $HISTSIZE
        例2:
            history 
  假设出现:10 manrm
            11 alias
  执行命令:!10        执行第10行指令
            !!         执行上一个指令
            !al        执行最近以al开头的指令    
25、无法记录时间的问题:
      可以透过~/.bash_logout进行history的纪录,并加上date的时间参数 
26、指令搜寻顺序: 
        1. 以相对/绝对路径执行指令,例如『 /bin/ls 』或『 ./ls 』;
        2. 由 alias 找到该指令来执行;
        3. 由 bash 内建的(builtin) 指令来执行;
        4. 透过 $PATH 这个发量癿顺序搜寻到的第一个指令来执行。
     例:alias echo='echo -n'
         type -a echo
27、进站与欢迎信息:
     cat /etc/issue   
  更改:vim /etc/issue
        CentOS release 5.3 (Final) (terminal: \l)
        Date: \d \t Kernel \r on an \m 
        Shawn Welcome to you!
        远程登录程序中用/etc/issue.net
     告知登录者信息:
        vim /etc/motd
        Hello everyone, Our server will be maintained at 2009/02/28 0:00 ~ 24:00. 
        Please don't login server at that time. ^_^     


28、bash的环境配置文件
       需分清login shell 与non-login shell    
       login shell只读的两个配置文件: 
            a、/etc/profile  系统整体设定,勿改为好;
                    可被呼叫的数据:
                        /etc/inputrc
                        /etc/profile.d/*.sh
                        /etc/sysconfig/i18n
            b、~/.bash_profile 或~/.bash_login 或~/.profile  个人设定(三选一,且依次读)
       读入环境配置文件指令:source
            source 配置文件档名
              例:将配置文件读进shell环境中,更改后可不注销,直接读取
                  source ~/.bashrc
                  . ~/.bashrc         此两行指令相同


            /etc/bashrc定义以下数据:                 
                  依据不同的 UID 规范出 umask 的值;
                 依据不同 UID 规范出提示字符 (就是 PS1 发量);
                  呼叫 /etc/profile.d/*.sh 的设定。

                       例:cat ~/.bashrc  显示预设内容。
            若~/.bashrc被误删的问题:
                  复制/etc/skel/.bashrc到家目录,修订内容,并使用source呼叫~/.bashrc 

   ~/.bashrc(non-login shell)
   此时,bash配置文件仅会读~/.bashrc    
      例:cat ~/.bashrc  显示预设内容
   /etc/bashrc 定义的数据:
        a、依据不同的 UID 规范出 umask的值;
        b、依据不同的 UID 规范出提示字符 (就是 PS1 发量);
        c、呼叫 /etc/profile.d/*.sh 的设定。          
29、其他配置:
       /etc/man.config  规定了当下达man时,该去何处查看数据的路径设定,核心MANPATH变量设定
          如以talball安装时,就需要将/usr/local/softpackage/man放到/etc/man.config
       注意:SuSE则用/etc/manpath.config 可用[tab]进行文件名补齐
       ~/.bash_history 保存历史记录
       ~/.bash_logout: 注销bash后,系统继续做什么才离开
30、终端机的环境设定:stty与set
       stty [-a]  将目前所有的stty参数列出来
          重要的代表意义:
               eof        结束输入
               erase      向后删除字符
               intr       送出中断到run
               kill       删除目前指令列上所有文字
               quit       送出quit到run  
               start      重启output
               stop       停止输出
               susp       送出一个terminal stop给run
        例:stty erase ^h   表示用ctrl+[h]代替原来的删除字符erase
     set [-uvCHhmBx] u显示错误信息/v显示原始内容/v指令内容/h与历史命令有关/H同上/m与工作管理有关/B与[]作用有关/C如使用>,档案存在则不被覆盖
        例:显示目前所有的set设定值:
               echo $-
        set -u
        echo $Shawn
        set -x
        echo $HOME
        cat /etc/inputrc
        cat /DIR_COLORS*
        cat /etc/termcap
      bash默认的组合键如下图:


31、通配符与特殊符号:
      利用通配符配合ls找档案:
         例:LANG=C  设定语系
             ll -d /etc/cron*     加d显示目录
             ll -d /etc/Shawn     找出Shawn的文件名
             ll -d /etc/*[0-9]    找出含数字文件名
             ll -d /etc/[^a-z]*   找出开头非小写字母文件名
             cp -a /etc/[^a-z]* /tmp  将上题找到的档案复制到/tmp


    特殊符号:
       


32、数据流重导向:将数据传导到其他地方去;
        传送所用特殊字符:
                 a、标准输入:         代码——0  <  <<   原本键盘输入改用档案内容取代/结束输入字符 
                 b、标准输出:        代码——1  >  >>   (>覆盖/>>累加)
                 c、标准错误输出:    代码——2  2>  2>>
         档案建立方式:不存在,则系统自动建立;存在则先清空再写入;>输出将覆盖。
    例:将stdout与stderr分存到不同的档案去
           find /home -name .bashrc > list_right 2> list_error


33、/dev/null垃圾桶黑洞装置与特殊写法:
        find /home -name .bashrc 2> /dev/null 丢弃错误数据,显示正确数据
        find /home -name .bashrc list 2>&1  
    例1:用cat指令来建立一个档案的简单流程:
        cat > catfile
        abcd
        test
        ctrl+[d]
        cat > catfile 
    例2:用 stdin 取代键盘的输入以建立新档案的简单流程:
        cat >catfile < ~/.bashrc
        ll catfile ~/.bashrc
    例3:cat > catfile << "eof"

34、命令执行判断依据:;,&&,||
      1、分号;:连续下指令   如 cmd;cmd

      2、command1 && command2 || command3   后两个需方肯定可以执行成功的指令

35、管线命令(pipe):| 
       每个管线后面接的第一个数据必定是指令!且能接受标准输入数据!


    攫取命令:cut,grep  它是一行一行分析

cut -d 分隔符 -f fields   【cut主要用途:同一行里面的数据分解】
cut -c 字符区间
   例1:echo $PAHT 
        echo $PATH | cut -d ':' -f 3,5
   例2:export
        export | cut -c 12-   取第12字符后的所有字符
last 输出【账号/终端机/来源/日期时间】
   例3:last | cut -d '' -f 1
grep [-acinv] [--color=auto] '搜寻字符串' filename 【分析一行信息】   a文本搜寻/c次数/i忽略大小写/n输出行/v反选/关键字加颜色
   例1:last | grep 'root' 取出有出现root那行
   例2:last | grep -v 'root' 与上相反
   例3:last | grep 'root' | cut -d '' -f1  有root就取出,仅取第一栏
   例4:grep --color='MANPATH' /etc/man.config  取出后面档案含MANPATH的那些行
36、排序命令:sort、wc、uniq
      a、sort [-fbMnrtuk] [file or stdin] f忽略大小写/b最前面忽略空格符/M月份排序/n纯数字/r反向/u相同数据仅一行/t分隔符,预设[tab]/k以区间排序
         需先让语系统一: LANG=C
            例1:cat /etc/passwd | sort  以a开设排序
            例2:cat /etc/passwd | sort -t ':' -k 3   以第三栏排序
            例3:cat /etc/passwd | sort -t ':' -k 3 n 数字排序
            例4:last | cut -d '' -f1 | sort  取出账号,加以排序
      b、uniq [-ic]   i忽略大小写/c进行计数
            例1:last | cut -d '' -f1 | sort | uniq
                 last | cut -d '' -f1 | sort | uniq -c  每个人登录总次数 结果不对?
      c、wc [-lwm]  l仅列出行/w列字/m字符
            例1:cat /etc/man.config |wc     显示行、字数、字符数
                 last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l  计算登入总人次(但后两行非账号内容) 第一个grep排除空行,第二个grep排除wtmp,再来计算行数即可。
37、双向重导向:tee [-a] file   a累加 将数据放入file中
       (相当于一个显示屏幕,一个存入档案)
     例1:last | tee last.list | cut -d " " -f1
          ls -l /home | tee ~/homefile | more
          ls -l / | tee -a ~/homefile | more  没有-a则会被覆盖哦


38、字符转换命令:tr,col,join,paste,expand
       1、tr [-ds] SET1 ...   d删除字符串/s取代重复字符
            例1:last | tr '[a-z]' '[A-Z]' 所有小写变大写(‘’可用可不用)
                 cat /etc/passwd | tr -d ':' 删除冒号
            例2:cp etc/passwd /root/passwd && unix2dos /root/passwd  unix2dos不存在?
                 file /etc/passwd /root/passwd
                 cat /root/passwd | tr -d '\r' > /root/passwd.linux   \r指DOS断行符
                 ll /etc/passwd /root/passwd*
       2、col [-xb]  x将tab转成对等空格键/b反斜杠时保留最后字符

            例1:cat -A /etc/man.config      cat -A显示所有特殊案件
                 cat /etc/man.config | col -x | cat -A | more
            例2:man col > /root/col.man     将col转成纯文本   
                 vi /root/col.man            为何结果不一样呢?
                 man col | col -b > /root/col.man
       3、join [-ti12] file1 file2    t相同档案联成一行/i忽略大小写/1第一档案用那字段分析/2第二档案同上
          功能:主要用于处理相关文件,注意需先对档案进行排序sort处理!
            例:head -n 3 /etc/passwd /etc/shadow
                join -t ':' -1 4 /etc/passwd -2 3 /etc/group
       4、paste [-d] file1 file2  d接分隔符/若file写成-,表示来自标准输入的资料!
            例:paste /etc/passwd /etc/shadow     同一行贴在一起,中间以[tab]隔开
                cat /etc/passwd | paste /etc/passwd /etc/shadow - | head -n 3   读出,贴上,取前三行    
       5、expand [-t] file    t后接数字    功能:将 [tab] 键转成空格键
            例:grep '^MANPATH' | /etc/man.config | head -n 3  取出行首,其标志为^。
                grep '^MANPATH' | /etc/man.config | head -n 3 | cat -A (cat可将所有符号列出)
                grep '^MANPATH' | /etc/man.config | head -n 3 | \
                expand -t 6 - | cat -A    将[tab]设定成6个字符
       6、分割命令 split [-bl] file PREFIX        b分割成的档案大小/l行数分割/前导符
            例:cd /tmp;split -b 300k /etc/termcap termcap
                ll -k termcap*
                cat termcap* >> termcapback 用数据流重导向,将分割的档案合并为一个
                ls -al / | split - | 10 - lsroot 每10行记录成一个档案
                wc -l | lsroot*
           备注:Windows下难以操作档案分割
       7、参数代换: xargs [-0epn] command   0有特殊字符/e结束/p执行前询问/n次数  
          功能:在产生某个指令的参数,读入stdin的数据,将其分隔成参数

    cut -d':' -f1 /etc/passwd | head -n 3 | xargs finger  没有finger目录?
    cut -d':' -f1 /etc/passwd | head -n 3 | xargs -p finger  询问?可回复y
    cut -d':' -f1 /etc/passwd | head -n 3 | xargs -p -e'lp' finger
    注意:要善用xargs,多参详manxargs,因为很多指令本身不支持管线。
39、关于减号-的用途:      
       tar -cvf - /home | tar -xvf -      -表示取用前一个指令stdout
40、回顾:
       1、核心在内存中受保护,需shell才可与之沟通,才能实现kernel控制硬件工作;
       2、Linux很多控制以shell来撰写的。
       3、系统合法的shell,均在/etc/shellz档案中。

参考:

参考数据不延伸阅读
 注1:Webmin 癿官方网站:http://www.webmin.com/
 注2:关亍 shell 癿相关历史可以参考网络农夫兄所整理癿优秀文章。网络农夫兄所建置癿网站暂时关闭, 因此底下癿链接为鸟哥刡网络上找刡癿片段文章连结。若有任何侵权事宜,请杢信告知,谢谢: http://linux.vbird.org/linux_basic/0320bash/csh/
 注3:使用 man bash,再以 PS1 为关键词去查询,按下数次 n 往后查询后,可以得到 PS1 癿发量说明。
 注4:i18n 是由一些 Linux distribution 贡献者共同収起癿大型计划,目癿在亍讥众多癿 Linux distributions 能够有良好癿万国码 (Unicode) 诧系癿支援。详绅的数据可以参考: i18n 的官方网站:http://www.openi18n.org/ 康桥大学 Dr Markus Kuhn 的文献:http://www.cl.cam.ac.uk/~mgk25/unicode.html Debian 社群所写癿文件:http://www.debian.org/doc/manuals/intro-i18n/
 卧龙小三癿教学文件:http://linux.tnc.edu.tw/techdoc/shell/book1.html
 GNU 计划癿 BASH 说明:http://www.gnu.org/manual/bash-2.05a/html_mono/bashref.html 鸟哥癿备份:http://linux.vbird.org/linux_basic/0320bash/0320bash_reference.php

单词:distribution 分布、wildcard 通配符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值