您的位置:首页 > 运维架构 > Shell

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

2016-11-05 22:08 706 查看
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笔指令

        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 通配符
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: