[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020]
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
jesson@jesson-HP:~/develop/workspace/shell_workspace$ chmod a+rx echotest.sh
jesson@jesson-HP:~/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}"
jesson@jesson-HP:~/develop/workspace/shell_workspace$ chmod a+rx readtest.sh
jesson@jesson-HP:~/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 显示控制字符
例子:
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat helloworld.sh注意,cat命令是将输入的所有内容显示出来,如果需要分页显示,则可借助于管道|以及more或less命令来实现。
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat helloworld.sh searchfile.sh
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"
#!/bin/bash
#searchfile
find . -name $1 -print
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat helloworld.sh searchfile.sh >shelltest.bakjesson@jesson-HP:~/develop/workspace/shell_workspace$ cat shelltest.bak
#!/bin/sh
#这是一个很简单的打印“hello world”的shell脚本
echo "hello world!"
#!/bin/bash
#searchfile
find . -name $1 -print
4. 管道|
可以通过管道把一个命令的输出传递给另一个命令作为输入。
用法:
格式:command1 | command2
例子:
jesson@jesson-HP:~/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
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l | grep parm.sh
-rwxrw-r-- 1 jesson jesson 637 1月 17 17:07 parm.sh
jesson@jesson-HP:~/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
jesson@jesson-HP:~/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
jesson@jesson-HP:~/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
jesson@jesson-HP:~/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,表示追加的意思。
- 一般用于管道之后。
例子:
jesson@jesson-HP:~/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
jesson@jesson-HP:~/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)
jesson@jesson-HP:~/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
jesson@jesson-HP:~/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@jesson-HP:~/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)
jesson@jesson-HP:~/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)
jesson@jesson-HP:~/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)
jesson@jesson-HP:~/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 <&- |
关闭标准输入 |
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat >>term.txt <<EOF
> Hello,I am learning shell
> and I am using a $TERM termianl
> bye...
> EOF
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat term.txt
Hello,I am learning shell
and I am using a xterm termianl
bye...
标准错误输出举例:
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l myfile
ls: 无法访问myfile: 没有那个文件或目录
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l myfile 2>ls_error.out
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat ls_error.out
ls: 无法访问myfile: 没有那个文件或目录
jesson@jesson-HP:~/develop/workspace/shell_workspace$ ls -l myfiile 2>/dev/null
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat /dev/null
jesson@jesson-HP:~/develop/workspace/shell_workspace$
3. 结合使用标准输出和标准错误
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat account_new.txt account_old.txt 1>account.out 2>acount.err
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat account_new.txt
jesson
cherry
root
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat account.out
jesson
cherry
root
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat account_old.txt
cat: account_old.txt: 没有那个文件或目录
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat acount.err
cat: account_old.txt: 没有那个文件或目录
4. 合并标准输出和标准错误
合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。
jesson@jesson-HP:~/develop/workspace/shell_workspace$ grep "jesson" account.out >grep.out 2>&1
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat grep.out
jesson
jesson@jesson-HP:~/develop/workspace/shell_workspace$ grep "jesson" account1.out >grep.out 2>&1
jesson@jesson-HP:~/develop/workspace/shell_workspace$ cat grep.out
grep: account1.out: 没有那个文件或目录
5. 文件描述符
3-9文件描述符(0-2,10-12已被系统占用,3-9可以供我们使用)
exec与文件描述符的结合使用:
file_desc.sh
#!/bin/bashname.txt
#file_desc.sh
exec 3<&0 0<name.txt
read line1
read line2
exec 0<&3
echo $line1
echo $line2
jesson给予可执行权限,运行该脚本:
cherry
jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ chmod a+rx file_desc.sh jesson@jesson-K43SV:~/develop/worksapce/shell_workspace$ ./file_desc.sh jessoncherr可以,看出exec在对文件描述符操作时,不会覆盖当前的shell。
以上,就是Shell的输入与输出的一些基本的命令和概念。