11.认识与学习bash

来源:互联网 发布:php经典面试题 编辑:程序博客网 时间:2024/04/29 01:38

1.认识shell

①shell的功能只是一个提供用户操作系统的一个接口,shell可以理解为转移器,在linux中,打开一个终端,并不代表打开了一个

    shell,只是表示终端会连接到shell。

②cat /etc/shell 可以查看目前可以使用的linux,如bash,sh,csh,ksh等等。每个sh都会有些区别,目前学习以bsh为重点。

    如果想切换sh,则可以直接输入csh或者ksh即可切换。

③bash shell的功能有很多,比如命令记忆功能,设置别名(alias lm=‘ls -al’)等。

④查询命令是否为bash shell的内置命令:type -t 命令名称

   alias:表示该命令为命令别名所设置的名称。

   builtin:表示该命令为bash内置的命令。

⑤命令一行输入不完,可以使用\回车进行转义,下一行会生成>,说明自己转义,系统当成同一行。

2.shell的变量

①变量的显示与设置

   如:xx=10 变量的定义

         echo $xx引用变量(变量的引用正规的写法,应该是echo ${xx},如果不加$,会直接输出字符串,而非变量

         unset 取消变量

②变量的设置规则

   ----变量名称的开不能是数字

   ----等号两边不能有空格

③环境变量(全局变量)

    设置环境变量的方法:export aa                          取消的方法:

                                    export bb=1                                            declare +x aa

                                    declare -x cc=2

                                    dd=4;declare -x dd

    echo $$ 可以显示shell的id号,新开一个sh后,id号会变动。

④位置变量

    脚本例子说明:vim xx.sh

                          #!/bin/bash

                          echo “这个程序的第名称是:$0”($0表示文件名)

                         echo “这个程序的第1个参数是:$1”

                          echo “这个程序的第2个参数是:$2”

                          echo “这个程序的第3个参数是:$3” 

                          echo “这个程序一共有$#($0表示参数的个数)个参数;分别是:$*($*表示所有参数的显示)

   则,输入:chomd +x xx.sh(增加一个可执行的权限)

                   ./xx.sh aa bb cc,

    就会输出:这个程序的名称是:xx.sh

                    这个程序的第1个参数是:aa

                    这个程序的第2个参数是:bb

                    这个程序的第3个参数是:cc

                    这个程序的一共有3个参数,分别是:aa bb cc

⑤单引号,双引号,反单引号(` `)的意义

    ----单引号:无法解析变量内容,只是把$变量当成普通字符输出。

    ----双引号:可以解析变量的内容,可以把$变量的内容输出。

    ----反单引号:在一串命令中,反单引号的内容可以被先执行。如:ls -l `locate crontab`(命令嵌套命令情况下)

                                                                       为区别单引号,可ls -l $(locate crontab)这样表示

3.环境变量的功能

①查看变量:env(查看环境变量)set(查看所有变量,包括环境变量和自定义变量)

②一些主要的环境变量

    ----HOME  :cd~

    ----HISTSIZE:由echo $HISTFILESIZE来决定

    ----LANG 语系:echo $LANG(如果有乱码,可试着把utf8改为gb2312)

    ----PS1:提示符

    ----PS2:转义字符的隔行符号

    ----$:PID.SHELL的线程代号,echo $$

    ----?:echo $?关于上个命令的回传代码(上个命令正确回传0,上个命令错误回传1)

4.变量的读取、数组与声明

①读取:read主要用于脚本设置

              如:read xx   (如果read后不加变量,会有一个read的默认变量REPLY

                     输入:9999

              echo $ xx   则显示:9999

      脚本案例:

                       #!/bin/bash

                       echo "请输入您的名字:"

                       read name

                       echo “欢迎您$name

②变量的声明:declare 变量名

           -i 整型

           -x 设为环境变量 +x 取消设置的环境变量

           -r 设置为只读(同 readonly xx一样)

③数组:array(标准写法为¥{数组},以免出现问题

           如:xx=(aa bb cc dd)(数组的下表从0-3

                  echo ${xx[*或@]} 可查看所有的元素

                  echo ${!xx[*或@]} 可查看所有的下标

                  echo ${#xx[@]} 可查看数组的个数

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

①变量内容的删除:

   echo ${变量名#删除的关键字},如:echo ${path#/*bin}(#代表从前到后删除最短的到bin这个关键字的,*表示前面是什么无所谓)

   echo ${变量名##删除的关键字},代表从前到后删除最长的到关键字的

   echo ${变量名%删除的关键字},代表从后到前删除最短的到关键字的

   echo ${变量名%%删除的关键字},代表从后到前删除最长的到关键字的

②变量内容的简单替换

   echo{变量/旧字符串/新字符串} 若变量内容符合旧字符串,则第一个旧字符串会被新字符串替换

   echo{变量//旧字符串/新字符串} 若变量内容符合旧字符串,则第全部旧字符串会被新字符串替换

③变量的测试和内容的替换

    “-号”只能判断变量知否存在

          unset xx                                            xx=10                                                            xx=    (空)(空与unset是2个概念)

          r=${xx-"aaaa"}                                 r=${xx-"aaaa"}                                             r=${xx-"aaaa"}                     (为空就会把空值

          echo $r  则输出aaaa                          echo $r 则输出10                                          echo $r  则输出     (空)                  传输出来)

      “:-”判断变量是否存在,并判断是否为空

          unset xx                                            xx=10                                                            xx=    (空)(空与unset是2个概念)

          r=${xx:-"bbbb"}                             r=${xx:-"bbbb"}                                           r=${xx:-"bbbb"}  

          echo $r  则输出bbbb                         echo $r 则输出10                                          echo $r  则输出 bbbb        (即使为空,也可以用-

                                                                                                                                            但 echo $xx 输出还是为空          后面的内容替换设置)

       “:=”为空会替换原值

           xx=    (空)

           r=${xx:-"cccc"}  

           echo $r  则输出cccc 

           echo $xx 则输出cccc(与:-区别)

       “:+”为空会替换原值

                  ----有定义(非空值):就会传输后面的内容

                  ----无定义(空值):就不会会传输后面的内容

       “:?”为空会替换原值

                  ----有定义(非空值):就会显示定义的值

                  ----无定义(空值):就会显示?后面的内容

5.命令别名与历史命令

   alisa rm=‘rm -r’

   unalisa rm

6.历史命令

   history 最多1000条最近执行的命令

   $HISTFILESIZE 绝对1000

   history -c 清空历史命令

7.bash shell的操作环节

①命令再执行时,命令的执行顺序

   如:type -a echo

         首先是执行:别名

         然后再执行:shell的内置命令

         再再执行:系统命令

②bash登陆与欢迎信息(/etc/issue登录前;/etc/motd欢迎信息;/etc/issue.net:telnet登陆的信息)

③bash环境配置文件

    ----登陆设置全局环境

          /etc/profile

          /etc/inputrc

          /ect/profile.d/*.sh

    ----登陆设置个人配置文件

           ~/.bash_profile

④快捷键的定义:stty -a

⑤终端机的设置 set

    -----set -u (开启变量未设置提示功能)如果定以后,一旦变量无定义,则就会输出错误提示(+u关闭此功能)

    -----set -x (开启显示命令内容++开头)    

⑥通配符

   ----*任意字符(0到多个)

   ----?一个字符

   ----[0-9]代表0到9

   ----[0\-9]代表0,-,9三个字符

   ----[^]代表非,[^0-9 ][  !0-9]

8.数据的重定向:可将原本输出在屏幕上的数据重新输出到其他地方(或者输入)

①输出重定向

    ----(1>)正确数据覆盖(1可写可不写)如:cal >xx(把cal的值输入在xx文件里,覆盖原xx内的原数据)                             

          (1>>)正确数据累加(1可写可不写) 如: date>>xx(把date的值输入在xx文件里,追加不覆盖原xx内的原数据)            

    ----(2>)错误数据覆盖,如:call 2>xx(call是个错误命令)

         (2>>)错误数据累加           (2>;2>>无法执行正确的重定向

    ----(&>)正确或者错误数据覆盖重定向

          (&>>)正确或错误数据累加重定向  

       1>&2:正确的像错误的一样导入  如:cal 2>xx 1>&2

       2>&1:错误的像错正确的一样导入   如:call >xx 2>&1(常用)

②输入重定向

    如:cat >xx

       自行输入:this is testing

        crlt+d离开

     这个时候xx的内容就是刚才输入的。

        cat>>xx>>EOF(以它结束的关键字)

       自行输入:this is testing

                          EOF(输入这个关键字后,就会结束,就不用crlt+d)

③命令执行的判断依据

    ----;:cmd1;cmd2,:分号依次执行cmd1和cmd2

    ----$?(命令回传码):真=0,假=!0

    ----cmd1&&cmd2:cmd1为假(肯定为假),则over,不会继续执行cmd2

           cmd1||cmd2:cmd1为真(肯定为真),则over,不会继续执行cmd2

9.管道命令(用管道连接多个命令)

   cmd1 | cmd2 cmd1的结果是cmd2的参数

   如:ls -al /etc | less 表示ls显示的结果通过管道传递给less来进行过滤(ls命令输出的内容可以被less读取)

①选取命令:cut grep

    ----cut -d'分隔符' -f'第几部分'(以分隔符为分割的第几部分):可以分析文件,如:cut -d :-f1 /etc/passwd

                          又如:last | cut -d  '' -f1 ,可以查看登陆的用户名(last查看登陆信息)

    ----grep过滤筛选:如: ifconfig eth0 | grep 'inet addr',可以在ifconfig文件中筛选出带有inet addr的行并显示。

             ifconfig eth0 |tee xx |grep 'inet addr'可先保存,再筛选,保存到xx中,会覆盖,相当于>;tee -a,则相当于>>

          如:grep root passwd 在passwd中查找root这个关键字

                  -i:忽略大小写

                  -n:加行号

                  -color:关键字加颜色

                  -An:向下显示n行,包括过滤行。

                  -Bn:向上显示n行,包括过滤行。

②排序命令:sort,wc,uniq

    ----sort:cut -d:-f3 passwd | sort -n(-n以纯数字把passwd第三行进行排序,利用管道)

                    sort -t(分隔符):-k(第几部分)3 -n passwd(直接利用sort排序)

            -n:使用纯数字进行排序

            -u:就是uniq,相同的数据只出现一行代表一下

    ----uniq:等同于sort -u ,但是uniq有些自己的参数,如

            -c:进行计数,比如显示登录名过滤后,可以显示这个登录名登录的个数,可以使用这个参数

    ----wc:字数统计 wc 文件名(会列出行数,字数,字符数)

             ls -1 / |wc -l 可以统计一个文件夹内有多少文件目录(ls -1表示一行行显示文件目录)

③字符转换命令

    ----tr:转换或删除

            如:tr  'a-z' 'A-Z'<hosts(把host内的内容以大写字母输出,不会改变源文件大小)

                  等同于 cat hosts | tr  'a-z' 'A-Z' 

                  如果想改变源文件的内容:tr  'a-z' 'A-Z' <hosts<hosts(错误,不可这样写,会损害文件)

                                                   需要:tr  'a-z' 'A-Z' <hosts<xx;mv xx hosts(分两步走)

            有如:cat passwd | tr -d ';'可删除passwd中所有的;

    ----col与expand:把tab转换为空格

             如:cat  /etc/man.config | col -x | cat -A | more

                             col -x :把tab转换为空格,等同于expand

                              cat -A:把tab的输出以^I显示,空格就是空格

     ----paste与join:将2个文件中的数据黏贴在一起

                 paste:直接粘,不会改变源文件,一般以tab分割,不考虑太多情况

                  join:比较严谨的黏贴,需要对比第一个字段的数据,如果第一个字段数据不对,则不会黏贴

                       按照设定规律结合:

                            join -t(指明分隔符)':' -1(第一个文件) 4(第4部分)  /etc/passwd -2(第一个文件) 3(第3部分) /etc/group

④切割命令:split 将大文件切割成小文件

                 如: split -b(指明每块大小) 300k /etc/termcap xx(以xx开头)   分割

                         cat xx* >>termcapback    组合

⑤参数替换:xargs :在不能使用管道的时候,可以加xargs,因为很多命令不支持管道

⑥关于-用途: tar -cvf - /home | tar -xvf -(直接打包,不写打包文件名,用-替代,直接传递到管道,也不管解压的是什么文件名)

0 0
原创粉丝点击