第二部分 第11章 认识Bash Shell

来源:互联网 发布:卢旺达种族灭绝 知乎 编辑:程序博客网 时间:2024/05/17 01:19

第二部分 第11章 认识Bash Shell
        1.什么是Shell, 狭义的是指Bash,广义的就是指同核心交互的程序
        2.shell的变量功能
            1) echo 获取变量,echo $variable 例子:echo $PATH
                echo $HOME ,$MAIL
            2) 设置变量,myname=dillon, echo $myname
                设置变量的规则
                1.用=来连接
                2.等号两边不能直接接空格
                3.变量名称,只能是英文,数字,,数字不能是开头字符
                4.若有空格,可以用“”,或‘’,“”保持变量特性,‘’仅为一般字符
                5.必要时需要转移字符“/”(Enter,$, /,空格,‘)
                6.用其他命令的方式:`command`
                7.若变量为扩展变量内容,需用双引号及$变量名称,如“$PATH”:/home
                累加
                8.若该变量需要在其他子程序中执行,需要用export使变量变成环境
                变量,如exprt PATH
                9.通常大写字母为系统默认值,自行设置变量可以使用小写,便于判断
                10.取消变量的方法为:unset变量名称
            3) 一些环境变量的说明,env
                HOME: 用户家目录
                SHELL:当前环境使用的shell程序,bash默认的是/bin/bash
                HISTSIZE:记录保存的历史数量个数
                ENV:用户所用的环境设置文件的读取文件
                MAIL:系统读取的邮件信箱文件
                PATH:文件搜索路径,用:分隔,文件的目录顺序也很重要
                LANG:语系文件
                RANDOM:随机数变量
           
            4)其他所得变量 :set
               显示环境变量和其他所有自定义变量
               几个重要的:
               PS1:提示符的设置,命令提示符。默认的PS1特殊符号的含义:
               /d:代表日期,
               /H: 完整的主机名
               /h: 主机的名称的第一个名字
               /t: 显示时间,24小时格式
               /T: 显示时间,12小时
               /A: 24小时制,HH:MM
               /u: 当前账户名称
               /v: bash版本信息
               /w:完整的工作目录,home以~替换
               /W:利用basename取得工作目录的名称,所以仅会列出最后一个目录名
               /#: 执行的第几个命令
               /$: 提示符,如果是root提示符为#,否则为$
              
               $ :当前PID,echo $$
               ?:上一个执行的命令所回传的值
              
               OSTYPE HOSTTYPE MACHTYPE
             
            5)自定义变量转化成环境变量 export
             
            6)语系文件的变量(locale)
            需要i18l支持的帮助,中文至少支持两种编码,BIG5和UTF-8
           
            LANG:主语言环境
            LC_CTYPE : 字符辨别的编码
            LC_NUMERIC : 数字系统的显示消息
            LC_    TIME: 时间系统的显示时间
            LC_COLLATE: 字符窜的比较与排序
            LC_MONETARY: 币值格式的显示
            LC_MESSAGES: 消息内容的显示,如菜单,错误消息
            LC_ALL: 语言环境整体设置
           
            7)变量的有效范围
                export的变量,其他子程序可以继续使用,没有export的则无法使用
                环境变量可以让子程序继续使用的原因:
                1)启动一个shell时,操作系统分配一块内容给shell,这个区域
                的变量可以让子程序访问
                2)使用export功能,可以让变量内容写到上述内存中(环境变量)
                3)加载另一个shell时,子shell可以将父shell的环境变量所在内容
                导入到自己的环境变量区块中
            8)变量的键盘读取,数组与声明:read,array,declare
                1.read read [-pt] variable
                2.declare / typeset
                    declare [-aixr] variable
                    -a: 后面的变量定义为数组
                    -i:定义为数字
                    -x:定义为环境变量
                    -r: 设置为只读,不能更改,也不能取消设置
               
                3.数组属性array说明
                var[index]=contect
                echo "${var[1]}"
               
            9) 与文件系统及程序的限制关系:ulimit
               ulimit [-SHacdflmnpstuv] [配额]
           
            10)附加的变量设置功能
                var=${str-expr}  
                var=${str:-expr}
                var=${str+expr}
                var=${str:+expr}
                var=${str=expr}
                var=${str:=expr}
                var=${str?expr}
                var=${str:?expr}
           
            11) 命令别名与历史命令
            alias cls=clear
            alias lm='lm -l | more'
            alias dir='ls -l'
            unalias dir
           
            12) 历史命令 history
            history -n, history -c history -a history -w
           
            !number, !command
           
            13) 环境设置文件
                etc/sysconfig/i18n 设置语系数据
                /etc/profile 设置几个重要的数据变量,PATH,USER
                MAIL,HOSTNAME,HISTSIZE
                /etc/bashrc :确定umask功能,提示符内容(PS1)
                /etc/profile.d/*.sh : 针对bash及C-shell规范了一些数据,
                /etc/man.config :设置man page的搜索路径
                /etc/inittab : 设置初始进入linux的模式。3代表字符控制台模式
                5代表 X11 模式
               
            14)个人设置值
                ~/.bash_profile, ~/.bash_login, ~/.profile
                这个文件可以定义个性化的路径与环境变量
                ~/.bashrc 每次执行shell脚本时会重新读取这个文件,所以是最
                完整的。而~/.bash_profile则只有在登录时才读取一次
                ~/bash_history 历史记录记录在这里,每次独立bash都会读取这个
                文件
                ~/.bash_logout 这个文件记录,“当我注销后,系统再帮我做什么
                操作后才离开”。
               
                读取规则:
                    1.先读取 /etc/profile 再跟去/etc/profile内容读取其他附加
                    设置文件,例如/etc/profile.d与/etc/inputc等设置文件
                    2.根据不同用户读取~/.bash_profile ~/.bash_login ~/.profile
                    3.根据不同目录,读取~/.bashrc
               
                利用source 指令或者. 都可以将设置文件的内容读进当前的shell环境
                中。
               
                /etc/issue 登录消息显示
                /etc/motd 编辑用户登录后欢迎信息
               
            15) 登录shell与非登录shell
                登录shell,是用户登录linux系统时,所取得的那个shell。当登录后
                再去执行其他shell,就是非登录shell。
                X环境下所启动的终端,都是非登录shell
                取得登录shell后,继续其他操作的shell时,读取的仅有!/.bashrc
                大部分~/.bash_profile的内容都指向~/.bashrc
           
            16) 终端的环境设置 stty, set
                stty -a 列出当前所有的stty参数
                特殊按键,[Ctrl] = ^
                eof : 结束输入
                erase :向后删除字符
                intr:给当前正在运行的程序发送一个interrupt(中断)信号
                kill:删除在当前命令行上的所有文字
                quit:给当前正在运行的程序发送一个quit信号
                start: 程序重启后,重新启动它的输出
                stop: 停止当前的屏幕输出
                susp: 给正在运行的程序发送terminal stop(终端停止)信号
               
                set : 设置变量相关,echo $-, 显示所有默认设置
                set -u 未定义变量,显示错误消息
                set -x 显示该命令内容
               
                其他键的设置功能,在/etc/inputrc
               
            17)通配符与特殊符号
            *,?,略
            # :注释
            / :转义
            | :分隔两个管道命令
            ; :连续两个命令的分隔符
            ~ : 用户家目录
            $ :加在变量前面,变量替换
            & :将命令变成后台工作
            ! :逻辑非
            / :路径分隔符
            >, >>,输出导向,分别是输出与累加
            ’ :单引号,不具有变量置换功能
            ” : 具有变量置换功能
            `` : 中间为可先执行的命令 可以用$()替换
            () : 中间为子shell的起始于结束
            [] : 中间为字符的组合
            {} :中间为命令区块的组合
           
            组合键:
            Ctrl + C : 终止当前命令
            Ctrl + D : 输入结束
            Ctrl + M :就是Enter
            Ctrl + S :暂停屏幕输出
            Ctrl + Q :恢复屏幕的输出
            Ctrl + U :在提示符下,删除整行命令
            Ctrl + Z : 暂停当前命令
           
            18) 数据流重导向
            就是将某个命令执行后应该出现在屏幕上的数据,传输到其他地方。
            一般命令执行流程
            文件=》命令=>文件/设备
            传送命令:
                1.标准输入(stdin):代码为0,使用<或<<
                2.标准输出(stdout):代码为1,使用>或>>
                3.标准错误输出(stderr):代码为2,使用2> 或2>>
               
                使用>, >>, >是替换功能,>>是追加功能
                command > 1> 2> 2>> < 设备或文件
                > 与 1>相同,都是标注输出,可以省略。
               
                多个输出:find /home -name testing > list_right 2> list_error
                一个输出:find /home -name testing > list_right 2> dev/null
                同时输出到一个文件:
                find /home -name testing > list 2>&1(特别注意,
                &1表示输入到第一个设备)
               
                输入:
                    cat > catfile :键盘输入,Ctrl + D结束
                   
                    cat > catfile < testingfile
                    testingfile文件的内容将输出到catfile里面
                   
                    cat > catfile <<eof
                    结束符为eof
               
                用命令重导向的情况:
                1.屏幕输出很总要,需要保存下来
                2.后台执行的程序,不希望它干扰屏幕正常的输出结果
                3.一些系统的例行命令执行结果,写昂可以保存
                4.一些命令,我们可能已经知道错误消息,2>/dev/null将之去掉
                5.错误消息与正确消息需要分别输出
               
            19) 命令执行的判断依据:;,&&, ||
                多个命令执行,用;隔开即可
                && 执行成功就执行后面的命令
                || 执行不成功然后执行后面的命令
           
            20) 管道命令(pipe)
                ls -al /etc | less
                | 仅能处理通过前面一个命令传来的正确信息,也就是标准输出
                (stdout)的信息,对于标准错误,并没有直接处理的能力。
                后一个命令的输入是前一个命令的输出。
               
            21) 选取命令:cut,grep
                将一段数据分析后,取出我们想要的部分,或者通过分析关键词,
                取得我们想要的行。一般来说,都是针对“逐行”分析的。
                cut -d'分隔符' -f fields : 按照分隔符将一段消息分为数段
                cut -c 字符范围 : 选组字符范围
               
                echo $PATH | cut -d ':' -f 5
                export | cut -c 12-20
                last | cut -d ' ' -f 1
                last | cut -d ' ' -f 1,2
               
                grep [-acinv] '搜索字符串' filename
                last | grep 'root'
                last | grep -v 'root'
                last | grep 'root' | cut -d ' ' -f 1
                grep 支持正则表达式,可以解析一行文字,取得关键字,若存在此
                关键字,则整行都会列出来
           
            22) 排序命令: sort, wc, uniq
                sort [-fbMnrtuk] [file or stdin]
                cat /etc/passwd | sort
                cat /etc/passwd | sort -t ':' -k 3
                (以":"分隔,第三栏来进行排序,文字排序)
                cat /etc/passwd | sort -t ':' -k 3 -n
                (以":"分隔,第三栏来进行排序, 数字排序)
                last | cut -d ‘ ’ -f 1 | sort (选取并排序)
               
                uniq [-ic], 将重复的数据仅显示一次
               
                last | cut -d ‘ ’ -f 1 | sort | uniq (不显示重复的)
                last | cut -d ‘ ’ -f 1 | sort | uniq -c (显示计数)
               
                wc [-lwm] :显示一个文件里有多少行,多少字,多少字节数。   
                cat /etc/man.config | wc
                last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
                显示登录的人的总次数
               
            23) 双向重导向
                既想出来数据流,又想保存文件等,可以tee命令
                tee [-a] file
               
                last | tee last.list | cut -d " " -f 1
                ls -l /home | tee ~/homefile | more
                ls -l /home | tee -a ~/homefile | more
           
            24) 字符转换命令 :tr,col,join, paste, expand
                tr [-ds] SET1 ..., 删除,或者文字消息的替换
                last | tr '[a-z]' ['A-Z']
                cat /etc/passwd | tr -d ':'
                cat /dostext | tr -d '/r' > dostex-noM
               
                col [-x] : 将tab键转换成对等的空格键
                cat /etc/man.config | col -x | cat -A | more
               
                join [-ti12] file1 file2
                处理两个文件有相同的数据行,将他们加在一起
                join -t ':' /etc/passwd /etc/shadow
                join -t ':' -l 4 /etc/passwd -2 3 /etc/group
               
                paste [-d] file1 file2,将两行贴在一起,中间以“tab”建隔开
                paste /etc/passwd /etc/shadow
                cat /etc/group | paste /etc/passwd /etc/shadow - | head -n 3
                (重点在-使用上, 常常表示stdin)
               
                expand [-t] file
                将tab剑转成空格键
                grep ‘^MANPATH’ /etc/man.config | head -n 3 | expand -t 6 -
                | cat -A
           
            25)文件拆分
                split [-bl] file PREFIX
                cd /tmp; split -b 300k /etc/terminfo terminfo
                cat terminfo* >> terminfoback
                ls -al / | split -l 10 -lsroot
               
            26)参数代替 xargs [-0epn] command (产生参数共命令使用)
                cut -d ':' -f 1 < /etc/passwd | head -n 3 | xargs finger
                cut -d ':' -f 1 < /etc/passwd | head -n 3 | xargs -p finger
                cut -d ':' -f 1 < /etc/passwd | xargs -p -n 5 finger
                cut -d ':' -f 1 < /etc/passwd | xargs -p -e 'lp' finger
           
            27) 减号(-)的用途
                tar -cvf - /home | tar -xvf -
               
           习题:
            1.在Linux上可以找到哪些shell, 哪个文件记录可以的shell,        
            Linux默认的shell是什么
            答:etc/shells 默认shell是bash
           
            2.在shell环境下,有个提示符(prompt),它可以修改么,要改什么,
            默认的提示符内容是什么
            答:可以修改,修改PS1变量即可,默认提示符是'/[/u@/h/W/]/$'
           
            3.如何显示HOME环境变量
            答:echo $HOME
           
            4.如何得知当前的所有变量与环境变量的设置值
            答:set 和 env 或 export
           
            5.是否可以设置一个变量名称为3myhome
            答:不可以,变量名称开头不能是3
           
            6.在这样的练习中“A=B且B=C“,执行”unset $A“ ,是取消的A还是B
            答:取消的是B, $A相当于是去的B的名称
           
            7.如何取消变量和命令别名的内容
            答:unset variable and unalias command
           
            8.如何设置一个变量名称为name内容为“It's my name”
            答:name="It's my name"
           
            9.环境变量文件的加载顺序是什么
            答:系统先加载/etc/profile
           
            10.man page的路径设置文件是什么
            答:/etc/man.config
                根据不同用户加载~/.bash_profile, ~/.bash_login, ~/.profile
                根据不同的用户读取~/.bashrc
               
            11.试说明‘,“,` 符号在变量定义中的用处
            答:’  :单引号,不具有变量置换功能
                ”  : 具有变量置换功能
                `` : 中间为可先执行的命令 可以用$()替换
           
            12.转义符号/有什么用途
            答:用于表示一些特殊的符号,//, /', /"等
           
            13.连续命令中,;&& || 有何不同
            答:&& 前一个命令执行成功才执行后面的,|| 前一个命令执行不成功执行
            才执行后面的指令
           
            14.如何在last的结果中,独立显示出帐号,并且显示本月份
            曾经登录过的帐号
            答:last | cut -d ' ' -f 1 | sort | uniq
           
            15.请问foo1 && foo2 | foo3 > foo4 中,foo1/foo2/foo3/foo4
            是命令还是文件,整串命令的含义是什么
            答:fool 是命令 foo2是命令 foo3 是命令 foo4是文件
            执行foo1指令成功执行foo2,输出的结果让foo3进行操作,foo3
            输出的结果写入到foo4文件中
           
            16.如何显示出在/bin下任何以a为文件名的详细数据
            答:ls -al /bin/a*
           
            17.如何显示出/bin下文件名为4个字符的文件
            答:ls /bin/????
           
            18.如何显示出/bin下文件名开头不是a-d的文件
            答:ls /bin/[!a-z]*
           
            19.离开bash后,希望系统可以将最近工作的:工作日期,100个历史命令
            独立记录到~/.bash_localcom 文件中,改如何设置
            答:vi ~/.bash_logout
                date >> ~/.bash_localcom
                history 100 >> ~/.bash_localcom
           
            20.要将终端机接口的登录提示符修改成自己喜好的样子,应该在哪里修改
            答:PS1='/[/u@/h/W/]/$'

 

            21.想让用户登录后才显示欢迎信息,应该在哪里修改
            答:进入etc/motd修改