bash 总结

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

 
 [[email protected] ~]# 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
 [[email protected] ~]# 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
 [[email protected] ~]# tr -d abc
 alpha
 lph
 amnbak
 mnk
 此处生成文档
 [[email protected] ~]# cat << EOF
 > how are you?
 > how old are you?
 > EOF
 how are you?
 how old are you?
 [[email protected] ~]# cat >> /tmp/test.out << EOF
 > how are you?
 > how old are you?
 > EOF
 [[email protected] ~]# cat /tmp/test.out 
 how are you?
 how old are you?
利用<<右侧的控制符,可以终止一次输入,而不必输入ctrl+d来结束。这对程序的编写很有帮助。那么为什么要使用命令输出重定向呢?如果没有接触过脚本,这个问题一定会很难理解,下面是一些命令输出重定向的场合:
 1. 当屏幕输出的信息很重要,而且我们需要将它存下来的时候
 2. 后台执行的程序,不希望它干扰屏幕正常的输出结果
 3. 一些系统的例行命令的执行结果,希望它可以存下来
 4. 一些执行命令,我们已经知道它可能的错误消息,所以想以2>/dev/null将它丢掉
 5. 错误消息与正确消息需要分别输出
大家都知道每个命令都有输入和输出,我们可不可以把前一个命令的输出当做后面命令的输入,大家都知道一个命令的输入可以从一个文件中读取,能不能从前一个命令中读取呢,这种机制就叫做管道,管道即把第一个命令的输出送给第二个命令当输入
 [[email protected] ~]# echo $PATH
 /usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
 [[email protected] ~]# 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
 [[email protected] ~]# 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
 [[email protected] ~]# ls -al /etc | less 使用ls命令输出后的内容,就能够被less读取,并且利用less的功能,我们就能够前后翻动相关的信息,很方便

 将登陆到系统上的用户信息中的后3行的信息转换为大写字母后保存至/tmp/who.out文件中
 [[email protected] ~]# who | tail -n 3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out
 将/etc/passwd/文件中的前5行内容转换为大写后保存至/tmp/passwd.out文件中
 [[email protected] ~]# cat /etc/passwd | head -n 5 | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out
 [[email protected] ~]# 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. 让目录及内部文件的其他用户没有任何权限
 [[email protected] ~]# 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键隔开,则会变成这样:
 [[email protected] ~]# 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表示失败
命令执行成功了,成功的标记叫状态返回值,而正常的命令执行后的结果叫返回值。
时间: 2024-10-09 05:46:56

bash 总结的相关文章

Linux Bash 提示符的一些骚操作

当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:[[email protected]$host ~]$你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~ 如何设置 Bash 提示符 Bash 提示符是通过环境变量 PS1 (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符.当然如果你需要更多的输

Bash脚本之函数定义和调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行.程序员将这种被封装起来的代码称为功能体,或者叫模块,也称为函数.这样看来是不是和循环类似,循环也是为了方便去多次执行一堆代码,而函数是将一堆代码写在一起,起一个名字,然后在需要这堆代码的时候只需要写上函数的名字即可.在shell脚本编程中,函数是由若干条shell命令组成的语句块,函数里面的内容和shell程序形式上是一致的.不同之处就是,shell代码可以直接被执行,而函数中的内容,不能独立执行,只有被调用的时候才

Bash 的若干基本问题

Bash 的若干基本问题 这里介绍一些bash启动前.后的问题,以及一些使用bash需要注意的基本问题. 1.Bash的介绍 Bash是一种Shell程序,它是一般的Linux系统中的默认的Shell程序,一般情况下Bash指的是/bin/bash这个软件. 一个Linux系统中有多少个可用的Shell程序,可以从/etc/shells文件中查出来. 当前登录用户的默认Shell是哪一个,可以从/etc/passwd文件中与此用户对应的那一行最后一个字段看出来.或者也可以通过echo $SHEL

bash

bash编程 if 条件判断; then fi if 条件判断; then 内容 else 内容 fi

004-用户、组、权限管理命令及bash配置文件、管道、重定向、grep

l  1.用户管理命令 1.)创建用户命令 useradd  [OPTIONS] USERNAME -u(UID):指定用户UID -g(GID):指定基本组 -G( group,...):指定附加组 -c"COMMENT":指定注释信息 -d(home_dir):指定家目录/path/to/directory -s:指定SHELL路径(/etc/shells指定了当前系统可用的安全shell) -m –k:强行为用户创建家目录 -M:不创建用户家目录 /etc/login.defs

bash编程

变量:命名内存空间 变量类型:事先确定数据的存储格式和长度 字符 数值 1.整型 2.浮点型 日期时间 布尔型 算数运算 逻辑运算:与.或.非.异或 shell:弱类型编程语言 强:变量在使用前必须声明,甚至要初始化变量.数字型初始化为0,字符型初始化为空NULL 弱:变量用时声明,甚至不区分类型,默认是字符串. 变量赋值:VAR_NAME=VALUE bash变量类型 环境变量 本地变量(局部变量):与bash进程关联的变量 位置变量 特殊变量(系统变量):linux内置,用于保存特殊数据的变

bash 数组参数的传递

一.方式一 把数组参数当做普通变量传递 #!/bin/bash function arrayfun { echo "get function parameter $*" } arraypara=(claire obama george) arrayfun $arraypara 上面脚最终会显示 get function parameter claire 只收到了数组中的第1个参数 二.方式二 我们改动一下 #!/bin/bash function arrayfun { echo &qu

bash简单for循环2

写一个脚本:输入三个参数 0,1,2,3之一输入3:计算100以内所有能被3整除的正整数的和:输入2:计算100以内所有所有偶数的和:输入1:计算100以内所有所有奇数的和:输入0:计算100以内所有所有整数的和: 代码 #!/bin/bash # declare -i SUM=0 if [ $1 == 3 ];then   for I in {1..100};do     if [ $[$I%3] -eq 0 ];then       SUM=$[$SUM+$I]     fi   done

Linux操作系统基础解析之(七)——Bash(Shell)基础知识(2)

三.命令历史bash从Korn Shell和C Shell中吸收了很多的精华,其中之一正式为已经执行过的命令保存一个缓存副本的特性,我们称之为"命令历史"功能.我们为什么要使用命令历史功能呢?每个用户登录成功之后,尤其是使用bash这样的文件接口登录之后,所有的操作都是由执行命令来实现的,那么就不可避免的会出现重复执行某个命令的情况,如果每个命令都依靠键入的方式来输入的话,固然没有问题,但是效率不高而且也是浪费时间的"可耻"行为,命令历史刚好给我们提供了解决这种问题

bash嵌套expect实现交换机的交互式登录实例

1. expect实现参数传递 1.1 实现 $argv 参数数组 expect脚本可以接受从bash传递过来的参数. 可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数 1.2 样例 cat telnet.exp #!/usr/bin/expect set host [lindex $argv 0] set passwd [lindex $argv 1] set passwden [lindex $argv 2] spawn telnet $h