首页 > 代码库 > bash 总结

bash 总结

I/O重定向
标准输出重定向
   > :覆盖重定向,目标文件中的原有内容会被消除
   >> :追加重定向,新内容会追加至目标文件尾部
   set -C :禁止将内容覆盖输出到已有的文件中 <只在当前shell中有效>
     若要强制覆盖可以使用 >| 例如 cat /etc/fstab >| /tmp/aa.txt
   set +C:关闭以上功能
   [root@Centos01 ~]# ls /var > /tmp/etc.out 
   [root@Centos01 ~]# ls /var/log/ >> /tmp/etc.out
标准错误重定向
 
 [root@Centos01 ~]# cat /etc/issuee 2> /tmp/issue.txt 
 [root@Centos01 ~]# cat /tmp/issue.txt
 cat: /etc/issuee: No such file or directory
 [root@Centos01 ~]# cat /etc/issue 2> /tmp/issue.txt 
 CentOS release 6.5 (Final)
 Kernel \r on an \m
 [root@Centos01 ~]# cat /tmp/issue.txt 发现文件是空的,因为没有错误输出,所以2>只能重定向错误输出
 2> :覆盖从定向错误输出
 2>> :追加重定向错误输出
将标准输出和错误输出各自定向到不同位置:
 [root@Centos01 ~]# tail -100 /etc/rc.d/rc.sysinit > /tmp/sysinit.out 2> /tmp/sysinit.err
 [root@Centos01 ~]# cat /tmp/sysinit.err 这个文件是空的
 [root@Centos01 ~]# cat /tmp/sysinit.out 这个文件是标准输出
 [root@Centos01 ~]# tail -100 /etc/rc.d/rc.sysinidddt > /tmp/sysinit.out 2> /tmp/sysinit.err
 [root@Centos01 ~]# cat /tmp/sysinit.err 
    tail: cannot open `/etc/rc.d/rc.sysinidddt‘ for reading: No such file or directory
可以合并标准输出和错误输出为同一个数据流进行重定向
 &> 覆盖重定向
 &>> 追加重定向
 [root@Centos01 ~]# echo $PATH
 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
 You have new mail in /var/spool/mail/root
 [root@Centos01 ~]# echo $PATH &> /tmp/path.out
 [root@Centos01 ~]# cat /tmp/path.out 
 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
 [root@Centos01 ~]# 
 [root@Centos01 ~]# echoooo $PATH &> /tmp/path.out
 [root@Centos01 ~]# cat /tmp/path.out 
 -bash: echoooo: command not found
 特殊写法:将标准输出和错误输出写到同一个文件可以使用2>&1
 [root@Centos01 ~]# echo "$PATH" > /tmp/path.out 2>&1
 [root@Centos01 ~]# echoddd "$PATH" >> /tmp/path.out 2>&1
 [root@Centos01 ~]# cat /tmp/path.out 
 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
 -bash: echoddd: command not found
输入重定向:将原本需要有键盘输入的数据,同过文件来读入。 <
 [root@Centos01 ~]# useradd jerry
 [root@Centos01 ~]# vi pass.txt
 [root@Centos01 ~]# passwd --stdin jerry < pass.txt
 [root@Centos01 ~]# cat aa.txt 
 test stdin 
 使用cat命令在键盘上输入一些数据,然后写入catfile文件中
 [root@Centos01 ~]# cat > catfile
 testing
 cat file tset
 输入crtl+d结束
 此时就会有catfile文件产生,而且该文件的内容就是刚刚输入的内容,那么是否可以使用其他文件来替换键盘输入呢
 [root@Centos01 ~]# cat > catfile < aa.txt 
 [root@Centos01 ~]# cat catfile 
 test stdin 
 [root@Centos01 ~]# 
 我们可以用cat直接将输入的消息输出到catfile中,并且当输入EOF时,该次输入就结束,可以这样做
 [root@Centos01 ~]# cat > catfile <<EOF
 > this is a test testing
 > ok now stop
 > EOF
 You have new mail in /var/spool/mail/root
 [root@Centos01 ~]# cat catfile 
 this is a test testing
 ok now stop
 [root@Centos01 ~]#

 
 [root@Centos01 ~]# tr abc ABC < /etc/fstab
 #
 # /etC/fstAB
 # CreAted By AnACondA on Thu Jun  2 19:35:06 2016
 #
 # ACCessiBle filesystems, By referenCe, Are mAintAined under ‘/dev/disk‘
 # See mAn pAges fstAB(5), findfs(8), mount(8) And/or Blkid(8) for more info
 #
 /dev/mApper/vg_Centos01-lv_root /                       ext4    defAults        1 1
 UUID=3BB70B22-A906-43eA-97d1-CA28485AfeC7 /Boot                   ext4    defAults        1 2
 /dev/mApper/vg_Centos01-lv_home /home                   ext4    defAults        1 2
 /dev/mApper/vg_Centos01-lv_swAp swAp                    swAp    defAults        0 0
 tmpfs                   /dev/shm                tmpfs   defAults        0 0
 devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
 sysfs                   /sys                    sysfs   defAults        0 0
 proC                    /proC                   proC    defAults        0 0
 [root@Centos01 ~]# tr ‘a-z‘ ‘A-Z‘ < /etc/fstab
 #
 # /ETC/FSTAB
 # CREATED BY ANACONDA ON THU JUN  2 19:35:06 2016
 #
 # ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER ‘/DEV/DISK‘
 # SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO
 #
 /DEV/MAPPER/VG_CENTOS01-LV_ROOT /                       EXT4    DEFAULTS        1 1
 UUID=3BB70B22-A906-43EA-97D1-CA28485AFEC7 /BOOT                   EXT4    DEFAULTS        1 2
 /DEV/MAPPER/VG_CENTOS01-LV_HOME /HOME                   EXT4    DEFAULTS        1 2
 /DEV/MAPPER/VG_CENTOS01-LV_SWAP SWAP                    SWAP    DEFAULTS        0 0
 TMPFS                   /DEV/SHM                TMPFS   DEFAULTS        0 0
 DEVPTS                  /DEV/PTS                DEVPTS  GID=5,MODE=620  0 0
 SYSFS                   /SYS                    SYSFS   DEFAULTS        0 0
 PROC                    /PROC                   PROC    DEFAULTS        0 0
 [root@Centos01 ~]# tr -d abc
 alpha
 lph
 amnbak
 mnk
 此处生成文档
 [root@Centos01 ~]# cat << EOF
 > how are you?
 > how old are you?
 > EOF
 how are you?
 how old are you?
 [root@Centos01 ~]# cat >> /tmp/test.out << EOF
 > how are you?
 > how old are you?
 > EOF
 [root@Centos01 ~]# cat /tmp/test.out 
 how are you?
 how old are you?
利用<<右侧的控制符,可以终止一次输入,而不必输入ctrl+d来结束。这对程序的编写很有帮助。那么为什么要使用命令输出重定向呢?如果没有接触过脚本,这个问题一定会很难理解,下面是一些命令输出重定向的场合:
 1. 当屏幕输出的信息很重要,而且我们需要将它存下来的时候
 2. 后台执行的程序,不希望它干扰屏幕正常的输出结果
 3. 一些系统的例行命令的执行结果,希望它可以存下来
 4. 一些执行命令,我们已经知道它可能的错误消息,所以想以2>/dev/null将它丢掉
 5. 错误消息与正确消息需要分别输出
大家都知道每个命令都有输入和输出,我们可不可以把前一个命令的输出当做后面命令的输入,大家都知道一个命令的输入可以从一个文件中读取,能不能从前一个命令中读取呢,这种机制就叫做管道,管道即把第一个命令的输出送给第二个命令当输入
 [root@Centos01 ~]# echo $PATH
 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
 [root@Centos01 ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘
 /USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN
 [root@Centos01 ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘| tr -d ‘U‘
 /SR/LIB64/QT-3.3/BIN:/SR/LOCAL/SBIN:/SR/LOCAL/BIN:/SBIN:/BIN:/SR/SBIN:/SR/BIN:/ROOT/BINYou have
 [root@Centos01 ~]# ls -al /etc | less 使用ls命令输出后的内容,就能够被less读取,并且利用less的功能,我们就能够前后翻动相关的信息,很方便

 将登陆到系统上的用户信息中的后3行的信息转换为大写字母后保存至/tmp/who.out文件中
 [root@Centos01 ~]# who | tail -n 3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out
 将/etc/passwd/文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中
 [root@Centos01 ~]# cat /etc/passwd | head -n 5 | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out
 [root@Centos01 ~]# cat /tmp/passwd.out 
 ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
 BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
 DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
 ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
 LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
脚本示例
 1. 创建一个组newgroup,id号为4000
 2. 创建一个用户test,id号为3001,附加组为newgroup
 3. 创建目录/tmp/hellod
 4. 复制/etc/fstab至上面的目录中
 5. 改变目录及内部文件的属主和属组为test
 6. 让目录及内部文件的其他用户没有任何权限
 [root@Centos01 ~]# cat aa.sh 
 #!/bin/bash
 groupadd -g 4000 newgroup
 useradd -u 3001 -G newgroup test
 mkdir /tmp/hellod
 cp /etc/fstab /tmp/hellod
 chown -R test:test /tmp/hellod
 chmod -R o= /tmp/hellod

变量的命名要求
 只能使用数字、字母、下划线组成
 不能以数字开头
 不能使用程序中关键字
 要做到见名之意
awk可以处理后续文件,也可以读取来自前一个命令的标准输出。awk主要是处理“每一行字段内的数据”,而默认的字段分隔符为空格键或tab键,举例来说,用last可以将登录者的数据取出来,结果如图所示:
若想取出账号与登录者的IP地址,且账号与IP地址之间以tab键隔开,则会变成这样:
 [root@Centos01 ~]# last | awk ‘{print $1 "\t" $3}‘
 root 192.168.1.100
 root 192.168.1.100
 reboot boot
 root :0.0
 root :0
awk是以行尾处理单位,而以字段为最小的处理单位
特殊变量:
 $0;脚本名称自身
 $?: 上一条命令的执行状态,状态用数字来表示:0-255 0表示成功,1-255表示失败
命令执行成功了,成功的标记叫状态返回值,而正常的命令执行后的结果叫返回值。


本文出自 “刘小兔” 博客,谢绝转载!

bash 总结