Linux Shell 脚本编程(3)—Shell输入与输出

shell 输入与输出


  • 提纲:
    echo        
    read        
    cat 
    管道  
    tee 
    文件重定向   
    标准输入输出和错误   
    合并标准输出和标准错误 
    exec和使用文件描述符
    文件重定向
  • 目标:
    终端用户登录linux服务器,为每一个终端用户启动一个shell程序。

1. echo

  • echo命令可以显示文本行或变量,或者把字符串输入到文件。

    • 命令格式: echo [option] string
echo  [option]  string

      #选项说明:-e  解析转义字符
           echo –e “ab\ncd”                echo “ab\ncd”
           ab                              ab\ncd

           cd

       -n  回车不换行,linux系统默认回车换行 eg: echo –n “abc” ; echo “abc” 

       -转义字符   ( \c(回车不换行) \f(禁止)\t(回车换行)  \n(回车换行)  )
#实验脚本文件  js.sh
#!/bin/bash
#echo
echo -e "demo01.... \n\n\n"
echo "ok"
#echo 空,后面没有任何东西,将要有一个回车换行
echo
echo "demo02......\n\n\n"
echo "demo03 line" >mylog.txt

#执行结果
demo01.... 



ok
空,后面没有任何东西,将要有一个回车换行

demo02......\n\n\n

2. read

  • read语句可以从键盘或文件的某一行文本中读入信息,并将其制复制给一个变量。
  • 格式: read var1 var2 ….
    若只指定了一个变量,那么read将会把所有的输入赋给该变量,直至遇上第一个文件结束符或者回车。如果给了多个变量,他们按照顺序分别赋予不同的变量。shell将用空格作为变量之间的分隔符。
#脚本文件 shll01.sh

#!/bin/bash
#readme
#注意回车不换行的用法

echo -n "First Name:"
read firstname

echo -n "Last Name:"
read lastname lastname2 

echo -e "FirstName: ${firstname}\n" 
echo -e "LastName: ${lastname}\n" 
echo -e "LastName2: ${lastname2}\n" 

#执行结果:
jianliu@ubuntu:~$ ./shell01.sh
First Name:kang
Last Name:jian bing
FirstName: kang

LastName: jian

LastName2: bing


3. cat

  • 是一个简单而通用的命令,可用它显示文件内容、创建文件、还可以用它来显示控制字符。

  • 格式: cat [options] filename1 … filename2 ….

   -v 显示控制字符
      eg:   cat –v dos.txt #显示dos文件的^M
  • 使用cat命令时注意,它不会在文件分页处停下来;它会一下显示完整个文件
    如果希望每次显示一页,可以使用more命令 或把cat命令的输出通过管道传递到另外一个具有分页功能的命令(more、less)中。
  eg:   cat longfile |more 
        cat longfile | less
        less longfile
  • man cat
jianliu@ubuntu:~$man cat
CAT(1)                           User Commands                          CAT(1)

NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.

       -A, --show-all
              equivalent to -vET

       -b, --number-nonblank
              number nonempty output lines, overrides -n

       -e     equivalent to -vE

       -E, --show-ends
              display $ at end of each line

       -n, --number
 Manual page cat(1) line 1 (press h for help or q to qui
  • 实例
cat myfile  

cat myfile1 myfile2 myfile3  #显示三个文件

cat myfile1 myfile2 > myfile12   #同时将文件2的内容拷贝(重定向)到文件12中(创建新的文件12,若其不存在)

4. 管道

  • 可以通过管道把一个命令的输出传递给另外一个命令做输入。管道用竖线 | 表示

  • 格式: 命令1 | 命令2

  • 实例

jianliu@ubuntu:~$ ls -l | grep "app2"
-rwxrwxr-x  1 jianliu jianliu 8501 Oct  6 19:26 app2

jianliu@ubuntu:~$ cat myfile | more

jianliu@ubuntu:~$ df –k | awk '{print $1}' | grep –v "Filesystem"
/dev/sda1   none    udev     tmpfs
none       none    none
#df –k 看磁盘空间 查找第一列 去除filesystem字符排除掉

5. tee

  • 结果输出到标准输出,另一个副本输出到相应文件(调试时相当有用

  • 格式:

    tee –a file     
        -a:    表示追加,在file后面追加内容
        不加-a 表示覆盖,覆盖之前的文件,重写。
eg:
jianliu@ubuntu:~$ who | tee -a who.out  
jianliu  :0           2017-10-06 01:36 (:0)
jianliu  pts/0        2017-10-06 20:04 (:0.0)
#输出到终端上,并且将结果写入who.out文件中。
  • 该命令一般用于管道之后 (一般看到输出,并存文件)
   df –k | awk '{print $1}' | grep –v "Filesystem" | tee partation.txt

6. 标准输入、输出及错误

  • 当我们在shell中执行命令的时候,每个进程都和三个打开的文件(文件描述符)相联系,并使用文件描符来引用这些文件。由于文件描述符fd不容易记忆, shell同时也给出了相应的文件名。
        输入文件—标准输入 0       ---fd0
        输出文件—标准输出 1       ----fd1
        错误输出文件—标准错误 2    ----fd2
  • 系统中实际上有12个文件描述符,但是正如我们在上表中所看到的,0、1、2是标准输入、出和错误。可以任意使用文件描述符3到9。

7. 文件重定向

  • 文件重定向:改变程序运行的输入来源和输出地点

这里写图片描述
!注意!!
——— 1>中 1和>中间不能有空格!!!———————–

  • 【1】重定向标准输出
   jianliu@ubuntu:~$ cat num1.txt
    25
    2
    10
    12
    23

    #对num1.txt中元素按照数值大小规则进行升序排序。
    jianliu@ubuntu:~$ cat num1.txt | sort -g   
    2
    10
    12
    23
    25

    #将排序结果存于num2.txt中
    jianliu@ubuntu:~$ cat num1.txt | sort -g > num2.txt
    #与上面的结果一样,等价命令。
    jianliu@ubuntu:~$ cat num1.txt | sort -g 1> num2.txt  
    #!注意!! 1>中 1和>中间不能有空格-----------------------

    #当前路径信息追加到path.out中
    pwd >> path.out 

    #nullfile.txt   如果想创建一个长度为0的空文件,可以用'filename'

  • 【2】重定向标准输入
    #将num1.txt的内容输入到sort进行排序,排序后的结果输出到终端
    #!!!默认情况下,sort按照ASCII码大小进行排序。
    jianliu@ubuntu:~$ sort <num1.txt
    10
    12
    2
    23
    25

    #从num1.txt中读内容,进行排序,排序结果输出到num2.txt中。
    jianliu@ubuntu:~$ sort -g < num1.txt > num2.txt


  • 【3】重定向标准错误
eg:$ grep "trident" missiles 2> /dev/null 
    #在这个例子中,grep命令在文件missiles 中搜索trident字符串
  • 【4】结合使用标准输出和标准错误
   eg:$ cat account_qtr.doc account_end.doc 1> accounts.out 2> accounts.err
  • 【5】合并标准输出和标准错误
    eg: grep "standard" standard.txt > grep.out 2> &1  
    #在上面的例子中,我们将 cleanup脚本的输出重定向到cleanup .out文件中,而且其错误也重定向到相同的文件中。

———注意:shell是从左至右分析相应的命令!!!!!!

/home/wbm/myshell
[wbm@wmblinux64 myshell]$ cat file1 file2 file3 > err.out 2< &1 
[wbm@wmblinux64 myshell]$ cat err.out 
111
1111
111111
222
22222
2222222
cat: file3: 没有那个文件或目录
[wbm@wmblinux64 myshell]$

【6】—-exec 与文件描述符在一起的情况

  • exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。

  • 语法: exec(选项)(参数)

  • 1、 exec命令可以用来代替当前shell;
    换句话说,并没有启动子shell,使用这一命令时,任何现有环境都将被清除,并重新启动一个shell。

首先使用echo命令将文本“Linux C++”进行输出,输入如下命令:
echo Linux C++           #输出指定信息
执行上面的指令后,输出如下信息:
Linux C++                #输出信息

然后再使用exec命令调用echo命令输出同样的信息,并且对输出的信息进行对比,输入指令如下所示:
exec -c echo Linux C++          #调用命令
执行以上命令后,其输出信息如下:
Linux C++                       #使用指定指令输出信息

通过比较两者执行后的结果来看,所实现的功能是相同的,即使用exec命令调用echo命令成功。

——- exec command command通常是一个shell脚本。

——-Eg:测试执行完该命令后,需要重新登录shell,然后export声明的变量都失效了。


  • 2 对文件描述符进行操作时,也只有这个时,它不会覆盖你的当前的shell。
#!/bin/bash
#file_desc
#
exec 3<&0 0<name.txt 
read line1 
read line2 
exec 0<&3 

echo $line1
echo $line2
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值