Bash

一.变量的显示与设置

1.显示变量:echo $变量名 or echo ${变量}

2.用“=”给变量赋值

  ①“=”两边不能有空格;

  ②变量名称只能是英文和数字,但是不能以数字开头;

  ③变量内容用双引号括起,若内容含有特殊字符(如$),则保持原本的特性;

     如:var="lang is $LANG",则echo $var可得 lang is en_US

  ④变量内容用单引号括起,若内容含有特殊字符(如$),则为一般字符;

     如:var='lang is $LANG',则echo $var可得 lang is$LANG

  ⑤可用转义字符“\”将特殊符号变为一般字符;

     如:var=lang\is\ \$LANG,则echo $var也可得 lang is $LANG

  ⑥在一串命令中,若要通过其他命令提供的信息,可用“`命令`”或“$(命令)”;

     如:version=$(uname -r),则echo $version可得2.6.18-128.el5

  ⑦若该变量为增加变量内容,可用'$变量名称”+要加的内容 ' or“${变量名称}+要加的内容

     如:b1=abc

           b1="$b1"de

           echo $b1        ----->abcde

           b1=${b1}fg
           echo $b1   ------>abcdefg

  ⑧若该变量需要在其他子进程执行,可用export来使变量变成环境变量;

  ⑨通常用大写字符表示系统默认变量,小写字符表示自定义变量;

  ⑩取消变量:unset 变量名称

3.查看环境变量:env

4.查看所有变量(包括环境变量和自定义变量):set

 查看的所有变量中,其中有一个是PS1(提示符的设置):

        \d:显示“星期月日”的格式;

        \H:完整的主机名;

        \h:仅取主机名在第一个小数点之前的名字;

        \t:显示24小时格式的时间“HH : MM : SS”;

        \T:显示12小时格式的时间“HH : MM : SS”;

        \A:显示24小时格式的时间“HH : MM”;

        \@:显示12小时格式的“am/pm”时间样式;

        \u:目前用户的账号名称;

        \v:BASH的版本信息;

        \w:完整的工作目录;

        \W:利用bashname函数取得工作木名称,所以仅会列出最后一个目录名;

        \#:执行的第几个命令;

        \$:用户提示符;

        如:[yonghu@CentOS learn]$PS1='[\u@\h \W]\$ \# \v '

              [yonghu@CentOS learn]$ 116 4.1 

  $:关于本shell的PID;

  ?:关于上个执行命令的回传码;

5.显示结果的语系变量:locale

6.读取来自键盘输入的变量:read [-pt] 变量名

  -p:后接提示语;

  -t:后接需等待的秒数,过时不候;

  如:[yonghu@CentOS learn]$read -p "Input..." -t 22 test1
        Input...tushushi

7.声明变量类型:declare/typeset [-aixr]  变量名

  -a:将变量名定义为数组类型;

  -i:将变量名定义为数字类型;

  -x:将变量名定义为环境变量;

  -r:将变量设置为readonly类型;

  如:[yonghu@CentOS learn]$sum=1+2+3
        [yonghu@CentOS learn]$echo $sum
        1+2+3

        [yonghu@CentOS learn]$typeset -i sum
        [yonghu@CentOS learn]$sum=1+2+3
        [yonghu@CentOS learn]$echo $sum

        6

  注:变量类型默认为“字符串”;

        bash环境中的数值运算,默认最多仅能达到整数类型; 

8.限制文件系统及程序:ulimit [-SHacdfltu] [配额]

  -H:hard limit;

  -S:soft limit;

  -a:后不会接任何参数,可列出所有的限制额度;

  -c:限制内核文件(core file);

  -d:进程可使用的最大断裂内存(segment)容量;

  -f:此shell可创建的最大文件容量,单位为KB;

  -l:可用于锁定(lock)的内存量;

  -t:可使用的最大CPU时间,单位为秒;

  -u:单一用户可使用的最大进程(process)数量;

  如:列出你目前身份的所有限制数据数值:

        [yonghu@CentOS learn]$ulimit -a
        core file size          (blocks, -c) 0
        data seg size           (kbytes, -d) unlimited
        scheduling priority             (-e) 0
        file size               (blocks, -f) unlimited
        pending signals                 (-i) 15018
        max locked memory       (kbytes, -l) 64
        max memory size         (kbytes, -m) unlimited
        open files                      (-n) 1024
        pipe size            (512 bytes, -p) 8
        POSIX message queues     (bytes, -q) 819200
        real-time priority              (-r) 0
        stack size              (kbytes, -s) 10240
        cpu time               (seconds, -t) unlimited
        max user processes              (-u) 1024
        virtual memory          (kbytes, -v) unlimited
        file locks                      (-x) unlimited

---------------------------------------------------------------------------------------

  如:限制用户仅能创建10MB以下的文件:

        [yonghu@CentOS learn]$ulimit -f 10240
        [yonghu@CentOS learn]$ulimit -a
        core file size          (blocks, -c) 0
        data seg size           (kbytes, -d) unlimited
        scheduling priority             (-e) 0
        file size               (blocks, -f) 10240

9.变量内容的删除与替代:

  (1)变量内容从头开始的数据符合“关键字”,则将符合的最短数据删除:${变量#关键字}

  (2)变量内容从头开始的数据符合“关键字”,则将符合的最长数据删除:${变量##关键字}

  (3)变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除:${变量%关键字}

  (4)变量内容从尾向前的数据符合“关键字”,则将符合的最长数据删除:${变量%%关键字}

  (5)变量内容符合“旧字符串”,则第一个旧字符串会被新字符串替换:${变量/旧字符串/新字符串}

  (6)变量内容符合“旧字符串”,则所有旧字符串会被新字符串替换:${变量//旧字符串/新字符串}

  如:[yonghu@CentOS learn]$path=${PATH}
        [yonghu@CentOS learn]$echo $path 
        /usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin

        [yonghu@CentOS learn]$echo ${path#/*bin}
        :/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin

        [yonghu@CentOS learn]$echo ${path##/*bin:}
        /home/yonghubin

        [yonghu@CentOS learn]$echo ${path%:*bin}
        /usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin

        [yonghu@CentOS learn]$ echo ${path%%:*/bin}
        /usr/lib/qt-3.3/bin

        [yonghu@CentOS learn]$ echo ${path/bin/BIn}
        /usr/lib/qt-3.3/BIn:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/yonghu/bin
        [yonghu@CentOS learn]$echo ${path//bin/BIn}
        /usr/lib/qt-3.3/BIn:/usr/local/BIn:/usr/BIn:/BIn:/usr/local/sBIn:/usr/sBIn:/sBIn:/home/yonghu/BIn

  注:必须从第一个开始匹配;

10.变量内容的替换:

变量设置方式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=expr
str不变
var=
str不变
var=$str
var=${str:=expr}
str=expr
var=expr
str=expr
var=expr
str不变
var=$str
var=${str?expr}expr输出至stderrvar=var=str
var=${str:?expr}expr输出至stderrexpr输出至stderrvar=str


二.命令别名与历史命令

1.设置别名:alias

  如:alias ll = 'ls -l'

  去掉别名:unalias 别名

  如:unalias ll

注:查看别名内容,只要直接输入“alias”即可

2.历史命令:history [n]

                 history [-racw]

  n:数字,列出最近的n条命令行;

  -r:将historyfiles的内容督导目前这个shell的history记忆中;

  -a:将目前新增的history命令ixnzengruhistfiles中,若没加histfiles,则默认写入~/.bash_history;

  -c:将目前的shell中的所有history内容清除;

  -w:将目前的history记忆内容写入histfiles中;

  执行第number条命令:!number

  由最近的命令向前搜寻并执行命令串开通为command的那条命令:!command

  执行上一个命令:!!/向上键


三.Bash的操作环境

1.Bash的登录信息:/etc/issue

  \d:本地端时间的日期;

  \l:显示第几个终端机接口;

  \m:显示硬件的等级(i386/i486/i586/i6866...);

  \n:显示主机的网络名称;

  \o:显示domain name;

  \r:操作系统的版本(相当于uname -r);

  \t:显示本地端时间的时间;

  \s:操作系统的名称;

  \v:操作系统的版本;

  如:要显示CentOS release 5.3(Final) (terminal:tty3)

                 Date:2015-01-01 15:10

                 Kernel 2.6.18-128.e15 on an i686

                 Welcome!

      可以如下修改/etc/issue:

                 CentOS release5.3(Final)(terminal:\l

                 Date:\d \t

                 Kernel \r on an \m

                 Welcome!

2.远程登录程序的界面登录信息:/etc/issue.net

3.用户登录后的信息:/etc/motd

4.终端机的输入按键查阅:stty [-a] 

  -a:将目前所有的stty参数列出来;

  如:[root@www ~]# stty -a

        speed 38400 baud; rows 24; columns 80; line = 0;

        intr = ^C; quit = ^\;erase = ^?; kill = ^U; eof = ^D...(以下省略)

  特殊字体的代表含义:

  eof:End of file,代表结束输入;(Ctrl+D)

  erase:向后删除字符;(Ctrl+?)

  intr:送出一个interrupt(中断)信号给目前正在运行的程序;(Ctrl+C)

  kill:删除在目前命令行上的所有文字;(Ctrl+U)

  quit:送出一个quit的信号给目前正在运行的程序;(Ctrl+\)

  start:在某个进程停止后,重新启动它的输出;(Ctrl+Q)

  stop:停止目前屏幕的输出;(Ctrl+S)

  susp:送出一个terminal stop的信号给正在运行的进程;(Ctrl+Z)

  注:^表示[Ctrl]按键的意思;

  如:若要用[ctrl]+h进行字符的删除,可以执行:

        stty erase ^h

5.设置bash自己的终端机:set [-uvCHhmBx]

  -u:默认不启动,若启用后,当使用未设置变量时,会显示错误信息;

  -v:默认不启用,若启用后,在讯息被输出前,会先显示信息的原始内容;

  -x:默认不启用,若启用后,在命令被执行前,会显示命令内容(前面有++符合);

  -h/H:默认启用,与历史命令有关;

  -m:默认启用,与工作管理有关;

  -B:默认启用,与方括号[]的作用有关;

  -C:默认不启用,使用>等时,若文件存在,该文件不会被覆盖;

  如:显示目前所有的set设置值:

        [yonghu@CentOS learn]$echo $-
 
                                            himuBH

6.通配符

符 号                      意   义
  *代表0到无穷多个任意字符
  ?代表一定有一个任意字符
  []代表一定有一个在中括号内的字符。如[abcd]代表一定有一个字符,可能是a,b,c,d中的任何一个
  [-]代表编码顺序内的所有字符。如[0-9]代表0到9之间的所有数字
  [^]表示原向选泽,如[^abc]代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思

7.特殊符号

符 号内 容
#批注符号,常被用在script中,视为说明,其后的数据均不执行
\转义符号,将“特殊字符或通配符”还原成一般字符
|管道,分隔IanGG额管道命令的界定
;连续命令执行分隔符,连续性命令的界定
~用户的主文件夹
$使用变量前导符,即是变量前需要加的变量替代值
&作业控制,将命令变成背景下工作
!逻辑运算意义上的“非”的意思
/目录符号,路径分隔的符号
>,>>数据流重定向,输出导向,分别是“替换”与“累加”
<,<<数据流重定向,输入导向
' '单引号,不具有变量置换的功能
" "双引号,具有变量置换的功能
` `两个“`”之间为先执行的命令,也可使用$()
( )在中间为子shell的起始与结束
{ }在中间为命令块的组合

8.标准输出(stdout):代码为1,使用>或>>;

  标准错误输出(stderr):代码为2,使用2>或2>>;

  如:查看你的系统根目录下个目录的文件名、权限等信息,并记录下来:

  [yonghu@CentOS learn]$ ll / > ~/rootfile  <==屏幕并无任何信息
  [yonghu@CentOS learn]$ ll ~/rootfile   <==有个新文件被创建
  -rw-rw-r--. 1 yonghu yonghu 1091 2月   1 16:21 /home/yonghu/rootfile

  (1)1>:以覆盖的方法将正确的数据输出到指定的文件或设备上;

  (2)1>>:以累加的方法将正确的数据输出到指定的文件或设备上;

  (3)2>:以覆盖的方法将错误的数据输出到指定的文件或设备上;

  (4)2>>:以累加的方法将错误的数据输出到指定的文件或设备上;

  注:“1>>”以及“2>>”中间是没空格的;

  (5)要将错误信息忽略掉而不显示或存储:可以输出定向到/dev/null;

  (6)将正确和错误的数据通通写入同一个文件:2>&1 or&>

          如:find /home -name .bashrc > list2>&1

                find /home -name .bashrc&> list

9.标准输入(stdin):代码为0,使用<或<<

  如:用cat命令创建一个文件的简单流程:

        [yonghu@CentOS learn]$cat > catfile
        testing
        cat file test

        <==这里按下[ctrl]+d来离开
        [yonghu@CentOS learn]$cat catfile 
        testing
        cat file test

  如:用stdin替代键盘的输入以创建新文件的简单流程:

        [yonghu@CentOS learn]$ cat > catfile< ~/.bashrc
        [yonghu@CentOS learn]$ llcatfile ~/.bashrc
        -rw-rw-r--. 1 yonghu yonghu 124 2月   1 16:47 catfile
        -rw-r--r--. 1 yonghu yonghu 124 7月  18 2013 /home/yonghu/.bashrc

  如:用cat直接将输入的信息输出到catfile中,且当由键盘输入eof时,结束输入:

        [yonghu@CentOS learn]$cat > catfile<< "eof"
        > This is a test.
        > OK now stop
        > eof
        [yonghu@CentOS learn]$cat catfile 
        This is a test.
        OK now stop

10.命令执行的判断依据

  (1)cmd ; cmd(不考虑相关性的连续命令执行);

         分号前的命令执行完后就会立刻接着执行后面的命令;

  (2)

          命令执行情况                                                                   说      明
cmd1 && cmd2若cmd1执行完毕且正确执行($?=0),则开始执行cmd2
若cmd1执行完毕且为错误($?≠0),则cmd2不执行
cmd1 || cmd2若cmd1执行完毕且正确执行($?=0),则cmd2不执行
若cmd1执行完毕且为错误($?≠0),则开始执行cmd2

  注:由于命令是一个接着一个去执行,因此如果真要使用判断,&&与||的顺序就不能搞错;

11.管道命令

  (1)管道命令仅会处理standard output,对于standard error output会予以忽略;

  (2)管道命令必须要能够接受来自前一个命令的数据成为standard input继续处理才行,如:less,more,head,tail等都是可以接收standard input的管道命令,而像ls,cp,mv等就不是管道命令,因为他们不会接收来自stdin的数据;

  (3)选取以“行”为单位的信息,将同一行的数据进行分解:cut -d '分隔字符' -f fields<==用于分隔字符

                                                                                     cut -c 字符范围              <==用于排列整齐的信息

         -d:后接分隔字符,与-f 一起使用;

         -f:依据-d的分隔字符将一段信息切割为数段,用-f取出第几段的意思;

         -c:以字符单位取出固定字符区间;

         如:将PATH变量取出,找出第五个路径:

               [yonghu@CentOS learn]$ echo $PATH | cut -d ':' -f 5
                                                     /usr/local/sbin

         如:将export输出的信息取得第12-20字符以后的所有字符串:

               export | cut -c 12-20

  (4)分析一行的信息,若有所需要的信息,则选取改行:grep [-acinv] [--color=auto] '查找字符串' filename

         -a:将Binary文件已text文件的方式查找数据;

         -c:计算找到'查找字符串'的次数;

         -i:忽略大小写的不同;

         -n:输出行号;

         -v:反向选择,即显示没有'查找字符串'内容的哪一行;

         --color=auto:可以将找到的关键字部分加上颜色显示;

        如:将last当中有出现root的那一行取出来:

              [yonghu@CentOS learn]$ last | grep 'root'
              root     tty2                          Sat Jun 21 15:55 - 16:00  (00:04)    

        如:将last中没root的取出:

              [yonghu@CentOS learn]$ last | grep -v  'root'
              root     tty2                          Sat Jun 21 15:55 - 16:00  (00:04)    

        如:在last输出的信息中,只要有root就取出,并且仅取第一列:

            [yonghu@CentOS learn]$last | grep  'root' | cut -d ' '  -f1
              root  

  (5)排序:sort [-fbMnrtuk] [file or stdin]

         -f:忽略大小写的差异;

         -b:忽略最前面的空格符部分;

         -M:以月份的名字排序,如JAN,DEC等的排序方法;

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

         -r:反向排序;

         -t:分隔符,默认是用[Tab]键来分隔;

         -u:uniq,相同的数据中,仅出现一行;

         -k:以区间(field)来进行排序;

         如:/etc/passwd内容是以“:”来分隔,将第三列进行排序:

              [yonghu@CentOS learn]$cat /etc/passwd | sort -t':' -k 3

        如:利用last将输出的数据仅取账号,并加以排序:

              [yonghu@CentOS learn]$last | cut -d ' ' -f1 | sort

  (6)唯一:uniq [-ic]

         -i:忽略大小写;

         -c:计数;

         如:用last将账号列出,仅取出账号列,排序后取出一位,并统计每人的登录次数:

              [yonghu@CentOS learn]$last | cut -d ' ' -f1 | sort | uniq -c
                    1 
                  79 yonghu
                  36 reboot
                    1 root
                    1 wtmp

  (7)统计文件中的字数、行数:wc [-lwm]

          -l:仅列出行;

          -w:列出多少字(英文单字);

          -m:统计字符;

          如:用last取出登录者,但是last最后两行并非账号内容,如何以一行命令取得这个月份登录系统的总人数:

                [yonghu@CentOS learn]$last | grep [a-zA-Z] | grep -v 'wtmp'| wc -l

  (8)双向(同时将数据流送与文件与屏幕)重定向:tee [-a] file

          -a:以累加方式将数据加入file中;

  (9)删除/替换文字信息:tr [-ds] SET1...

         -d:删除信息中SET1这个字符串;

         -s:替换重复的字符;

         如:将last输出的信息中小写字符变大写:

               [yonghu@CentOS learn]$ last | tr -s [a-z] [A-Z]

  (10)col [-xb]

           -x:将tab键转换为对等的空格键;

           -b:在文字内有反斜杠(/)时,仅保留反斜杠最后接的那个字符;

           注:col常被利用于将man page转存为纯文本文件以方便查阅;

  (11)将两个文件中有相同数据的那一行加在一起:join [-ti12] file1 file2

            -t:分隔符,默认为空格,若两文件相同,则将两条数据练成一行,且第一个字段放第一个;

            -i:忽略大小写;

            -1:第一个文件用哪个字段来分析;

            -2:第二个文件用哪个字段来分析;

            如:/etc/passwd第四个字段是GID,那个GID记录在/etc/group中的第三个字段,如何将两文件整合:

                 join -t ':' -1 4 /etc/passwd -2 3 /etc/group

  (12)将两行贴在一起,并以[tab]键隔开:paste [-d] file1 file2

            -d:后接分隔字符,默认为tab键;

            -:若file部分写成-,表示来自standard input的数据;

  (13)将[tab]键转换为空格键:expand [-t] file

            -t:后可接数字,定义tab键代表多少个字符;

  (14)将空白转为tab键:unexpand

  (15)切割命令:split [-bl] file PREFIX

            -b:后接欲切割的文件的大小,可加单位;

            -l:以行数进行切割;

            PREFIX:前导符,可作为切割文件的前导文字;

            如:将splitFile1aa文件分为50一个文件:

                  [yonghu@CentOS learn]$ split -b 50 splitFile1aa qie

                  [yonghu@CentOS learn]$ ll
                  -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieaa
                  -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieab
                  -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieac
                  -rw-rw-r--. 1 yonghu yonghu   26 2月   8 16:44 qiead
                  -rw-rw-r--. 1 yonghu yonghu  176 1月   1 20:32 splitFile1aa

          如:将上面的四个小文件合成一个文件,文件名为qieback:

                [yonghu@CentOS learn]$ cat qiea* >> qieback
                [yonghu@CentOS learn]$ ll
                -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieaa
                -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieab
                -rw-rw-r--. 1 yonghu yonghu   50 2月   8 16:44 qieac
                -rw-rw-r--. 1 yonghu yonghu   26 2月   8 16:44 qiead
                -rw-rw-r--. 1 yonghu yonghu  176 2月   8 16:45 qieback
                -rw-rw-r--. 1 yonghu yonghu  176 1月   1 20:32 splitFile1aa

  (16)参数代换:xargs [-0epn] command

            -0:若输入的stdin含有特殊字符,可将它还原为一般字符;

            -e:end of file,后接字符串,当xargs分析到该字符串时,停止工作;

            -p:询问用户;

            -n:后接次数,每次执行command命令执行时,要使用几个参数的意思;command默认为echo;

            注:因为好多命令不支持管道命令,因此可通过xargs提供该命令引用standard input之用;

            如:找出/sbin下具有特殊权限的文件名,并用ls -l列出详细属性:

                  [yonghu@CentOS]$ find /sbin/ -perm +7000 | xargs ls -al
                  -rwsr-xr-x. 1 root root 122784 11月 22 2013 /sbin/mount.nfs
                  -rwxr-sr-x. 1 root root   6180 11月 23 2013 /sbin/netreport
                  -rwsr-xr-x. 1 root root   9596 11月 22 2013 /sbin/pam_timestamp_check
                  -rwsr-xr-x. 1 root root  34168 11月 22 2013 /sbin/unix_chkpwd

                 注:若不加xargs,列出的是当前所在目录下的文件属性;

  (17)减号用途:在管道命令中,会使用到前一个命令的stdout作为这次的stdin,某些命令要用到文件名(如tar)进行处理时,该stdin与stdout可利用减号替代;


12.bash的内置命令:type [-tpa] name

  不加任何参数,type会显示出那么是外部命令还是bash的内置命令;

  -t:type会将name以下面的字眼显示出它的意义:

       file:表示外部命令;

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

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

  -a:后接的name为外部命令时,才会显示完整的文件名;

  -p:会由PATH变量定义的路径中,将所有含name的命令都列出来,包括alias;

        如:type -a ls

       ls is aliased to 'ls --color=tty'

       ls is /bin/ls


13.命令换行:若觉得命令不想一行输入完,要换行输,可以加“\+[Enter]”;






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值