linux学习之shell脚本 ------- 输入与输出

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]

前面介绍了Shell脚本的基础和运算符等,今天再来看一下关于Shell脚本的输入与输出。

Shell输入与输出的一些命令:

  echo

  read

  cat

  管道

  tee

  exec  

Shell输入与输出的一些概念:

  文件重定向

  标准输入、输出和错误

  合并标准输出和标准错误

  使用文件描述符

  下面,我们挨个看每个命令的用法:

输入输出命令的用法:

  1. echo

  该命令的作用是可以显示文本行或变量,或者把字条串输入到文件.

  用法:

   echo [option] string

   - -e 解析转义字符

   - -n 回车不换行,linux系统默认回车换行

   - 转义符 (\c(回车不换行),\f(静止),\t(tab),\n(回车换行))

  例子:

echotest.sh

#!/bin/bash
#echotest
echo -e "we are\f testing echo\tcommand\n\n"
echo -n "we are testing echo command"
echo "OK"
echo
echo "we are testing echo command\n\n"
echo "output this string to file">echo_output.txt

  给予可执行权限,并执行该脚本,如下:

[email protected]:~/develop/workspace/shell_workspace$ chmod a+rx echotest.sh
[email protected]:~/develop/workspace/shell_workspace$ ./echotest.sh
we are
       testing echo	command

we are testing echo commandOK

we are testing echo command\n\n

  

  2. read

  read命令可以从键盘或文件的某一行文本中读入信息,并将其赋值给一个变量。

  用法:

   read var1 var2 ...

   - 如果只指定一个变量,那么read将会把所有的输入赋给该变量,直至遇到第一个文件结束符或回车;如果给出了多个变量,它们按顺序分别被赋予不同的变量。shell将用空格作为变量之间的分隔符。

  例子:

readtest.sh

#!/bin/bash
#readtest
echo -n "First Name:"
read firstname
echo -n "Last Name:"
read lastname
echo -e "Your first name is:$firstname"
echo -e "Your last name is:$lastname"
echo -n "province and city:"
read province city
echo -e "Your address provice:${province}"
echo -e "Your address city:${city}"

  给予权限,执行脚本:

[email protected]:~/develop/workspace/shell_workspace$ chmod a+rx readtest.sh
[email protected]:~/develop/workspace/shell_workspace$ ./readtest.sh
First Name:Steve
Last Name:Jobs
Your first name is:Steve
Your last name is:Jobs
province and city:California San Francisco
Your address provice:California
Your address city:San Francisco

  3. cat

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

  用法:

  - -v 显示控制字符

  例子:   

[email protected]:~/develop/workspace/shell_workspace$ cat helloworld.sh
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"

[email protected]:~/develop/workspace/shell_workspace$ cat helloworld.sh searchfile.sh
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"

#!/bin/bash
#searchfile
find . -name $1 -print
[email protected]:~/develop/workspace/shell_workspace$ cat helloworld.sh searchfile.sh >[email protected]:~/develop/workspace/shell_workspace$ cat shelltest.bak
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"

#!/bin/bash
#searchfile
find . -name $1 -print

  注意,cat命令是将输入的所有内容显示出来,如果需要分页显示,则可借助于管道|以及more或less命令来实现。

  4. 管道|

  可以通过管道把一个命令的输出传递给另一个命令作为输入。

  用法:

   格式:command1 | command2

  例子:

[email protected]:~/develop/workspace/shell_workspace$ ls -l
总用量 32
-rw-rw-r-- 1 jesson jesson  25  1月 22 20:16 cattest.sh
-rw-rw-r-- 1 jesson jesson  27  1月 22 19:50 echo_output.txt
-rwxrwxr-x 1 jesson jesson 209  1月 22 19:50 echotest.sh
-rwxrw-r-- 1 jesson jesson  94  1月 15 21:20 helloworld.sh
-rwxrw-r-- 1 jesson jesson 637  1月 17 17:07 parm.sh
-rwxrwxr-x 1 jesson jesson 299  1月 22 20:10 readtest.sh
-rwxr-xr-x 1 jesson jesson  47  1月 17 15:21 searchfile.sh
-rw-rw-r-- 1 jesson jesson 141  1月 22 20:18 shelltest.bak
[email protected]:~/develop/workspace/shell_workspace$ ls -l | grep parm.sh
-rwxrw-r-- 1 jesson jesson 637  1月 17 17:07 parm.sh
[email protected]:~/develop/workspace/shell_workspace$ df -k
df: "/root/.gvfs": 权限不够
文件系统           1K-块      已用      可用 已用% 挂载点
/dev/sda9       29525076  12915484  15109792   47% /
udev             2031604         4   2031600    1% /dev
tmpfs             816612       860    815752    1% /run
none                5120         0      5120    0% /run/lock
none             2041528       792   2040736    1% /run/shm
/dev/sda10      49135432  28230216  18409268   61% /home
/dev/sda1       73400952  43260784  30140168   59% /media/00006A15000514EC
/dev/sda5      138424040 123913684  14510356   90% /media/00010A370001FCE2
/dev/sda6       56504040  44425044  12078996   79% /media/000E2D72000188C0
/dev/sda7      138134868  32924076 105210792   24% /media/0008EEFF00004113
[email protected]:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}'
df: "/root/.gvfs": 权限不够
文件系统
/dev/sda9
udev
tmpfs
none
none
/dev/sda10
/dev/sda1
/dev/sda5
/dev/sda6
/dev/sda7
[email protected]:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}' | grep -v "文件系统"
df: "/root/.gvfs": 权限不够
/dev/sda9
udev
tmpfs
none
none
/dev/sda10
/dev/sda1
/dev/sda5
/dev/sda6
/dev/sda7
[email protected]:~/develop/workspace/shell_workspace$ df -k | awk '{print $1}' | grep -v "文件系统"|grep dev
df: "/root/.gvfs": 权限不够
/dev/sda9
udev
/dev/sda10
/dev/sda1
/dev/sda5
/dev/sda6
/dev/sda7

  

  5. tee

  tee命令把输出的一个副本输送到标准输出,另一个副本则拷贝到相应的文件中。

  用法:

   tee -a files

   - 如果希望在看到输出的同时,也将其存入一个文件,那么,这个命令就最合适,-a,表示追加的意思。

   - 一般用于管道之后。

  例子:

[email protected]:~/develop/workspace/shell_workspace$ ll
总用量 40
drwxrwxr-x  2 jesson jesson 4096  1月 22 20:18 ./
drwx------ 17 jesson jesson 4096  1月 21 17:53 ../
-rw-rw-r--  1 jesson jesson   25  1月 22 20:16 cattest.sh
-rw-rw-r--  1 jesson jesson   27  1月 22 19:50 echo_output.txt
-rwxrwxr-x  1 jesson jesson  209  1月 22 19:50 echotest.sh*
-rwxrw-r--  1 jesson jesson   94  1月 15 21:20 helloworld.sh*
-rwxrw-r--  1 jesson jesson  637  1月 17 17:07 parm.sh*
-rwxrwxr-x  1 jesson jesson  299  1月 22 20:10 readtest.sh*
-rwxr-xr-x  1 jesson jesson   47  1月 17 15:21 searchfile.sh*
-rw-rw-r--  1 jesson jesson  141  1月 22 20:18 shelltest.bak
[email protected]:~/develop/workspace/shell_workspace$ who | tee who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
[email protected]:~/develop/workspace/shell_workspace$ ll
总用量 44
drwxrwxr-x  2 jesson jesson 4096  1月 22 20:33 ./
drwx------ 17 jesson jesson 4096  1月 21 17:53 ../
-rw-rw-r--  1 jesson jesson   25  1月 22 20:16 cattest.sh
-rw-rw-r--  1 jesson jesson   27  1月 22 19:50 echo_output.txt
-rwxrwxr-x  1 jesson jesson  209  1月 22 19:50 echotest.sh*
-rwxrw-r--  1 jesson jesson   94  1月 15 21:20 helloworld.sh*
-rwxrw-r--  1 jesson jesson  637  1月 17 17:07 parm.sh*
-rwxrwxr-x  1 jesson jesson  299  1月 22 20:10 readtest.sh*
-rwxr-xr-x  1 jesson jesson   47  1月 17 15:21 searchfile.sh*
-rw-rw-r--  1 jesson jesson  141  1月 22 20:18 shelltest.bak
-rw-rw-r--  1 jesson jesson  127  1月 22 20:33 who.out
[email protected]:~/develop/workspace/shell_workspace$ cat who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
[email protected]:~/develop/workspace/shell_workspace$ who | tee -a who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
[email protected]:~/develop/workspace/shell_workspace$ cat who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
[email protected]:~/develop/workspace/shell_workspace$ who | tee  who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)
[email protected]:~/develop/workspace/shell_workspace$ cat who.out
jesson   tty7         2015-01-17 12:34
jesson   pts/0        2015-01-21 21:07 (:0)
jesson   pts/2        2015-01-21 21:07 (:0)

  5. exec

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

  用法:

   exec command

   -其中的command通常是一个shell脚本。

   对文件描述符进行操作的时候(也只有在这时),它不会覆盖你当前的shell。

输入输出的基本概念:

  1. 标准输入、输出和错误

  在shell中执行命令时,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件,由于文件描述符不容易记,shell同时也给出了相应的文件名。


文件


文件描述符


输入文件-标准输入


0(缺省是屏幕,也可以是文件)


输出文件-标准输出


1(缺省是键盘,也可以是文件或其他命令的输出)


错误输出文件-标准错误


2(缺省是屏幕,也可以是文件)

  2. 文件重定向

  改变程序运行的输入来源和输出地点。

  用法:


Command > filename


把标准输出重定向到一个新文件中


Command >> filename


把标准输出重定向到一个文件中(追加)


Command 1 > filename


把标准输出重定向到一个文件中


Command > filename 2>&1


把标准输出和标准错误一起重定向到一个文件中


Command 2 > filename


把标准错误重定向到一个文件中


Command 2 >> filename


把标准错误重定向到一个文件中(追加)


Command >> filename 2>&1


把标准输出和标准错误一起重定向到一个文件中(追加)


Command < filename > filename 2


Command命令以filename文件作为标准输入,以filename2文件作为标准输出


Command < filename


Command命令以filename文件作为标准输入


Command << delimiter


从标准输入中读入,直至遇到delimiter分界符


Command <&m


把文件描述符m作为标准输入


Command >&m


把标准输出重定向到文件描述符m中


Command <&-


关闭标准输入

标准输入部分举例:Command << delimiter

[email protected]:~/develop/workspace/shell_workspace$ cat >>term.txt <<EOF
> Hello,I am learning shell
> and I am using a $TERM termianl
> bye...
> EOF
[email protected]:~/develop/workspace/shell_workspace$ cat term.txt
Hello,I am learning shell
and I am using a xterm termianl
bye...

标准错误输出举例:

[email protected]:~/develop/workspace/shell_workspace$ ls -l myfile
ls: 无法访问myfile: 没有那个文件或目录
[email protected]:~/develop/workspace/shell_workspace$ ls -l myfile 2>ls_error.out
[email protected]:~/develop/workspace/shell_workspace$ cat ls_error.out
ls: 无法访问myfile: 没有那个文件或目录
[email protected]:~/develop/workspace/shell_workspace$ ls -l myfiile 2>/dev/null
[email protected]:~/develop/workspace/shell_workspace$ cat /dev/null
[email protected]:~/develop/workspace/shell_workspace$ 

  3. 结合使用标准输出和标准错误

[email protected]:~/develop/workspace/shell_workspace$ cat account_new.txt account_old.txt 1>account.out 2>acount.err
[email protected]:~/develop/workspace/shell_workspace$ cat account_new.txt
jesson
cherry
root
[email protected]:~/develop/workspace/shell_workspace$ cat account.out
jesson
cherry
root
[email protected]:~/develop/workspace/shell_workspace$ cat account_old.txt
cat: account_old.txt: 没有那个文件或目录
[email protected]:~/develop/workspace/shell_workspace$ cat acount.err
cat: account_old.txt: 没有那个文件或目录

  4. 合并标准输出和标准错误

  合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。

[email protected]:~/develop/workspace/shell_workspace$ grep "jesson" account.out >grep.out 2>&1
[email protected]:~/develop/workspace/shell_workspace$ cat grep.out
jesson
[email protected]:~/develop/workspace/shell_workspace$ grep "jesson" account1.out >grep.out 2>&1
[email protected]:~/develop/workspace/shell_workspace$ cat grep.out
grep: account1.out: 没有那个文件或目录

  5. 文件描述符

  3-9文件描述符(0-2,10-12已被系统占用,3-9可以供我们使用)

  exec与文件描述符的结合使用:

file_desc.sh

#!/bin/bash
#file_desc.sh
exec 3<&0 0<name.txt
read line1
read line2
exec 0<&3
echo $line1
echo $line2

name.txt

jesson
cherry

  给予可执行权限,运行该脚本:

[email protected]:~/develop/worksapce/shell_workspace$ chmod a+rx file_desc.sh
[email protected]:~/develop/worksapce/shell_workspace$ ./file_desc.sh
jesson
cherr

  可以,看出exec在对文件描述符操作时,不会覆盖当前的shell。

  

  以上,就是Shell的输入与输出的一些基本的命令和概念。

时间: 2024-10-12 03:17:11

linux学习之shell脚本 ------- 输入与输出的相关文章

linux学习之shell脚本

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] Shell脚本基本元素: #!/bin/bash --- 第一行 # --- 注释 变量 流程控制结构 看一个简单的例子,学任何语言,我想大多数情况下都是从helloworld程序开始的,shell也是一门语言,我们也从helloworld开始. 新建一个名为helloworld.sh的文件,在里面写入: helloworld.sh #!/bin/sh #这是一个很简单的打

linux学习笔记:shell脚本编程相关(上)

前言 unix/linux操作系统下的shell,是一种壳,其目的是提供一个用户与计算机相互交互的命令接口,通过输入各种命令,达到操作的目的. 与此同时,shell支持控制流程,进而可以组合出各种各样的应用实例. shell脚本的格式 首行shebang机制: bash脚本,首行添加#!/bin/bash [options] csh脚本,首行添加#!/bin/csh [options] ksh脚本,首行添加#!/bin/ksh [options] -- 描述脚本的注释部分: 包括Author,

Linux学习日记—shell脚本基础

在Linux的日常维护中,shell脚本是我们必不可少的日常管理之一:其作用是解决服务器的自动化维护工作,减轻管理员的工作量:如果想提高shell脚本的编写速度,必须要熟练使用vi编辑器的各种快捷键. [什么是shell]    Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使

linux学习之shell脚本 ------- 脚本参数传递

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天再来看一下如何向shell脚本传递参数,需要掌握两个命令,一个是 shift命令,另一个是getopts. 脚本参数传递 shift命令 用法: shift n 每次将参数位置向左偏移n位 假如我们要实现统计多个文件的总行数,就可以用到这个shift命令了,如下: opt2.sh #!/bin/bash #op2 static files total lines; st

Linux学习日记—Shell脚本与计划任务

本篇文章将以实现MySQL数据库的定期自动备份为目标,介绍Shell脚本与计划任务的完美协作过程.其中,Shell脚本负责具体的备份操作,Crond服务器负责控制备份周期. [确认备份方案] 备份主机:IP地址为192.168.4.110,通过机柜内网络连接目标主机. 数据库服务器:IP地址为192.168.4.11,MySQL服务监听端口为3306. 备份内容:对MySQL服务器中的studydb,coursdb库进行远程备份,每天凌晨2:30执行,每个库备份独立的.sql文件,然后压缩为.t

Linux学习-高级shell脚本编程(一)函数

引文: 通常编写shell脚本时,你会发现很多地方都要用到相同的代码或者说是相同的功能.如果是一段小代码,那无所谓.可如果多次使用而且还是相同的代码,我想你也会感觉很烦的.为了能够让代码重用,这就使用到函数了. 温馨提示 变量赋值的格式为: 变量名=变量值 注意事项: 变量名前面不应加美元"$"符号.(和PHP不同)等号"=" 前后不可以有空格.和C语言不同,Shell中不需要显式的语法来声明变量. 变量名不可以直接和其他字符相连,如果想相连,必须用括号:echo

linux学习19 shell脚本基础-bash脚本编程基础及配置文件

一.shell脚本编程 1.编程语言的分类,根据运行方式 a.编译运行:源代码 --> 编译器(编译) --> 程序文件 C语言: b.解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行:即源代码本身并不能运行,而是启动一个解释器的进程,把整个源代码的内容当做解释器的参数.因为其是边解释边运行因此运行过程中比起编译运行速度会差一些. c.无论是编译器还是解释器中间总需要另外一个程序,即在运行过程中全程参与,这就是我们说的翻译官,他需要将我们人能识别的代码转换成机器所能识别的

linux学习之shell脚本 ------- 文本过滤

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天来看一下shell关于文字过滤的知识,其实最主要的就是正则表达式以及关于文本的一常见的命令. 正则表达式: 一种用来描述文本模式的特殊语法. 由普通字符(例如字符a到z)以及特殊字符(称为元字符,如/.*.?等)组成. 基本元字符集及其含义: 字符 含义 ^ 只匹配行首 $ 只匹配行尾 * 匹配0个或多个单字符 [ ] 只匹配[]内字符,可以是一个单字符,也可以是字符序

linux学习之shell脚本 ------- 控制流结构

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天开始学一些同其他高级语言一样的shell流控制结构 流控制语句: 1. if语句 语句格式: if condition1 then command1 else condition2 then command2 else command3 fi 注:if语句必须以fi终止. 如果没有condition2,则if语句可以简化为如下: if condition then co