变量($、echo)以及io重定向(< 、>、 >>)
2014-06-22 17:38
387 查看
2.3 一个简单的脚本
who命令可以告诉你现在系统有谁登陆:
[plain] view
plaincopy
[root@localhost ~]# who
root pts/2 2012-05-05 09:38 (192.168.0.83)
root pts/3 2012-05-05 09:38 (192.168.0.83)
利用wc(字数计算)程序,它可以算出行数(line),字数(word),字符数(character)。在此例中,我们用的是wc -l
[plain] view
plaincopy
[root@localhost ~]# who|wc -l
2 //计算用户个数
|(管道)符号可以在两个程序之间建立管道(pipeline):who的输出,成了wc的输入,wc所列出的结果就是已登录用户的个数
下一步则是把管道转变成一个独立的命令。方法是把这条命令输入一个一般的文件中,然后使用chmod为该文件设置执行权限,如
[plain] view
plaincopy
[root@localhost ~]# vim test_who //建立文件
#! /bin/sh -
who | wc -l //程序的内容
[plain] view
plaincopy
[root@localhost ~]# chmod +x test_who //让文件拥有执行的权限
[root@localhost ~]# ./test_who //执行测试
2 //输出我们要的结果
2.5.2 变量
在Shell的世界里,变量值可以是(而且通常是)空值,也就是不含任何字符
Shell变量名称的开头是一个字母或下划线符号,后面可以接着任意长度的字母,数字或者下划线。
[plain] view
plaincopy
[root@localhost ~]# vim test_var
[root@localhost ~]#
#! /bin/sh -
myvar="hello word"
echo $myvar
echo -n "请输入参数:"\
echo $PATH
printf "The first program always prints ' %s,%s! ' \n" hello world 11
变量赋值的方式为:先写变量名称,紧接着=字符,最后是新值,中间完全没有任何空格。当你想取出Shell变量的值时,需要变量名称前面加上$字符,当所赋予的值内含空格时,请加上引号:
表 2-2 echo的转义序列
\a序列通常用来引起用户的注意;\0ddd序列最有用的地方,就是通过送出终端转义序列进行(非常)原始的光标操作。但不建议这么做。
2.5.4 华丽的printf输出
printf不像echo那样会自动提供一个换行符号。你必须显示地将换行符号指定成\n
第一部分是一个字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符串包含了按 字面显示的字符(characters to be printed literally)以及格式声明(format specifications),后者是特殊的占位符(placeholders),用来描述如何显示相应的参数(argument)。
第二部分是与格式声明相对应的参数列表(argument list),例如一系列的字符串或变量值。格式声明分成两部分:百分比符号(%)和指示符(specifier)。最常用的格式指示符(format specifier)有两个,%s用于字符串,而%d用于十进制整数。
2.5.5 基本的I/O重定向
程序应该有数据的来源端,数据的目的端(数据要去的地方)以及报告问题的地方,它们分别被称为 标准输入(standard input)、标准输出(standard output)、以及标准错误输出(standard error)
默认的标准输入、标准输出以及标准错误输出都是终端
在用户登录系统时,UNIX变将默认的标准输入、输出及错误输出安排成你的终端。
2.5.5.1 重定向与管道
Shell提供了数种语法标记,可用来改变默认I/O的来源端与目的端
以<改变标准输入
program < file 可将program的标准输入修改为file:
tr -d '\r' < dos-file.txt
以>改变标准输出
program > file 可将program的标准输出修改为file:
tr -d '\r' < dos-file.txt > UNIX-file.txt
这条命令会先以tr将dos-file.txt里的ASCII carriage-return(回车)删除,在将转换完成的数据输出到UNIX-file.txt。dos-file.txt里的原始数据不会有变化。
> 重定向符(redirector)在目的文件不存在时,会新建一个。然而,如果目的文件已存在,它就会被覆盖;原本的数据都会丢失
以>>附加到文件
program>>file可将program的标准输出附加到file的结尾处。
如同>,如果目的文件不存在,>>重定向符便会新建一个。然而,如果目的文件存在,它不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处:
以|建立管道
program1 | program2 可将program1的标准输出修改为program2的标准输入。
tr
语法
tr [options]source-char-listreplace-char-list
用途
转换字符。例如,将大写字符转换成小写。选项可让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个
常用选项
-c
取source-char-list的反义。tr要转换的字符,变成未列在source-char-list中的字符。此项通常和-d或-s配合使用
-C
与-c相似,但所处理的是字符(可能是包含多个字节的宽字符),而非二进制的字节值。
-d
自标准输入删除source-char-list里所列的字符,而不是转换它们。
-s
浓缩重复的字符。如果标准输入中连续重复出现source-char-list里所列出的字符,则将其浓缩成一个。
行为模式
如同过滤器:自标准输入读取字符,再将结果写到标准输出
举例:
[plain] view
plaincopy
[root@localhost ~]# vi test1.txt
test1 1
test2 2
test3 3
test4 4
test5 5
[plain] view
plaincopy
[root@localhost ~]# tr -d '\n' < test1.txt
test1 1test2 2test3 3test4 4test5 5
警告
根据POSIX标准的定义,-c处理的是二进制字节值,而-C处理的是现行locale所定义的字符。
注意:构造管道时,应该试着让每个阶段的数据量变的更小
例如,使用sort排序之前,先以grep找出相关的行;这样可以让sort少做些事。
.
2.5.6 基本命令查找
Shell会沿着查找路径$PATH来寻找命令。$PATH是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令。
默认路径(default path)至少包含/bin与/usr/bin,或许还包含存放X Windows程序的/usr/X11R6/bin,以及供本地系统管理人员安装程序的/usr/local/bin
名称为bin的目录用来保存可执行文件,bin是binary的缩写,也可以直接把bin解释成相应的英文字义--存储东西的容器;
如果你要编写自己的脚本,最好准备自己的bin目录来存放它们,并且让Shell能够自动找到它们。这不难,只要建立自己的bin目录,并将它加入$PATH中的列表即可:
[plain] view
plaincopy
[root@localhost ~]# cd ~
[root@localhost ~]# mkdir bin
[root@localhost ~]# mv /usr/
bin/ include/ lib/ man/ src/ X11R6/
etc/ java/ libexec/ sbin/ tmp/
games/ kerberos/ local/ share/ ucb/
[root@localhost ~]# mv /usr/ucb/nusers ./bin/
[root@localhost ~]# PATH=$PATH:$HOME/bin
[root@localhost ~]# nusers
1
[root@localhost ~]#
要让修改永久生效,在.profile文件中把你的bin目录加入$PATH,而每次登陆时,Shell都将读取.profile文件,例如:
PATH=$PATH:$HOME/bin
在$PATH里的空项目(empty component)表示当前目录(current directory)。空项目位于路径值中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或者尾端,可以分别表示查找时最优先查找或最后查找当前目录:
PATH=:/bin:/usr/bin //先找当前目录
PATH=/bin:/usr/bin: //最后找当前目录
PATH=/bin:/usr/bin //当前目录居中
如果你希望将当前目录纳入查找路径(search path),更好的做法是在$PATH中使用点号(dot)
空项目在可移植性上有点问题
一般来说,你根本就不应该在查找路径中放进当前目录,因为这会有安全上的问题。
who命令可以告诉你现在系统有谁登陆:
[plain] view
plaincopy
[root@localhost ~]# who
root pts/2 2012-05-05 09:38 (192.168.0.83)
root pts/3 2012-05-05 09:38 (192.168.0.83)
利用wc(字数计算)程序,它可以算出行数(line),字数(word),字符数(character)。在此例中,我们用的是wc -l
[plain] view
plaincopy
[root@localhost ~]# who|wc -l
2 //计算用户个数
|(管道)符号可以在两个程序之间建立管道(pipeline):who的输出,成了wc的输入,wc所列出的结果就是已登录用户的个数
下一步则是把管道转变成一个独立的命令。方法是把这条命令输入一个一般的文件中,然后使用chmod为该文件设置执行权限,如
[plain] view
plaincopy
[root@localhost ~]# vim test_who //建立文件
#! /bin/sh -
who | wc -l //程序的内容
[plain] view
plaincopy
[root@localhost ~]# chmod +x test_who //让文件拥有执行的权限
[root@localhost ~]# ./test_who //执行测试
2 //输出我们要的结果
2.5.2 变量
在Shell的世界里,变量值可以是(而且通常是)空值,也就是不含任何字符
Shell变量名称的开头是一个字母或下划线符号,后面可以接着任意长度的字母,数字或者下划线。
[plain] view
plaincopy
[root@localhost ~]# vim test_var
[root@localhost ~]#
#! /bin/sh -
myvar="hello word"
echo $myvar
echo -n "请输入参数:"\
echo $PATH
printf "The first program always prints ' %s,%s! ' \n" hello world 11
变量赋值的方式为:先写变量名称,紧接着=字符,最后是新值,中间完全没有任何空格。当你想取出Shell变量的值时,需要变量名称前面加上$字符,当所赋予的值内含空格时,请加上引号:
表 2-2 echo的转义序列
序列 | 说明 |
\a | 警示字符,通常是ASCII的BEL字符 |
\b | 退格 |
\c | 输出中忽略最后的换行符(Newline)。这个参数之后的任何字符,包括接下来的参数,都会被忽略掉(不打印) |
\f | 清除屏幕(Formfeed) |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠字符 |
2.5.4 华丽的printf输出
printf不像echo那样会自动提供一个换行符号。你必须显示地将换行符号指定成\n
第一部分是一个字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符串包含了按 字面显示的字符(characters to be printed literally)以及格式声明(format specifications),后者是特殊的占位符(placeholders),用来描述如何显示相应的参数(argument)。
第二部分是与格式声明相对应的参数列表(argument list),例如一系列的字符串或变量值。格式声明分成两部分:百分比符号(%)和指示符(specifier)。最常用的格式指示符(format specifier)有两个,%s用于字符串,而%d用于十进制整数。
2.5.5 基本的I/O重定向
程序应该有数据的来源端,数据的目的端(数据要去的地方)以及报告问题的地方,它们分别被称为 标准输入(standard input)、标准输出(standard output)、以及标准错误输出(standard error)
默认的标准输入、标准输出以及标准错误输出都是终端
在用户登录系统时,UNIX变将默认的标准输入、输出及错误输出安排成你的终端。
2.5.5.1 重定向与管道
Shell提供了数种语法标记,可用来改变默认I/O的来源端与目的端
以<改变标准输入
program < file 可将program的标准输入修改为file:
tr -d '\r' < dos-file.txt
以>改变标准输出
program > file 可将program的标准输出修改为file:
tr -d '\r' < dos-file.txt > UNIX-file.txt
这条命令会先以tr将dos-file.txt里的ASCII carriage-return(回车)删除,在将转换完成的数据输出到UNIX-file.txt。dos-file.txt里的原始数据不会有变化。
> 重定向符(redirector)在目的文件不存在时,会新建一个。然而,如果目的文件已存在,它就会被覆盖;原本的数据都会丢失
以>>附加到文件
program>>file可将program的标准输出附加到file的结尾处。
如同>,如果目的文件不存在,>>重定向符便会新建一个。然而,如果目的文件存在,它不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处:
以|建立管道
program1 | program2 可将program1的标准输出修改为program2的标准输入。
tr
语法
tr [options]source-char-listreplace-char-list
用途
转换字符。例如,将大写字符转换成小写。选项可让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个
常用选项
-c
取source-char-list的反义。tr要转换的字符,变成未列在source-char-list中的字符。此项通常和-d或-s配合使用
-C
与-c相似,但所处理的是字符(可能是包含多个字节的宽字符),而非二进制的字节值。
-d
自标准输入删除source-char-list里所列的字符,而不是转换它们。
-s
浓缩重复的字符。如果标准输入中连续重复出现source-char-list里所列出的字符,则将其浓缩成一个。
行为模式
如同过滤器:自标准输入读取字符,再将结果写到标准输出
举例:
[plain] view
plaincopy
[root@localhost ~]# vi test1.txt
test1 1
test2 2
test3 3
test4 4
test5 5
[plain] view
plaincopy
[root@localhost ~]# tr -d '\n' < test1.txt
test1 1test2 2test3 3test4 4test5 5
警告
根据POSIX标准的定义,-c处理的是二进制字节值,而-C处理的是现行locale所定义的字符。
注意:构造管道时,应该试着让每个阶段的数据量变的更小
例如,使用sort排序之前,先以grep找出相关的行;这样可以让sort少做些事。
.
2.5.6 基本命令查找
Shell会沿着查找路径$PATH来寻找命令。$PATH是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令。
默认路径(default path)至少包含/bin与/usr/bin,或许还包含存放X Windows程序的/usr/X11R6/bin,以及供本地系统管理人员安装程序的/usr/local/bin
名称为bin的目录用来保存可执行文件,bin是binary的缩写,也可以直接把bin解释成相应的英文字义--存储东西的容器;
如果你要编写自己的脚本,最好准备自己的bin目录来存放它们,并且让Shell能够自动找到它们。这不难,只要建立自己的bin目录,并将它加入$PATH中的列表即可:
[plain] view
plaincopy
[root@localhost ~]# cd ~
[root@localhost ~]# mkdir bin
[root@localhost ~]# mv /usr/
bin/ include/ lib/ man/ src/ X11R6/
etc/ java/ libexec/ sbin/ tmp/
games/ kerberos/ local/ share/ ucb/
[root@localhost ~]# mv /usr/ucb/nusers ./bin/
[root@localhost ~]# PATH=$PATH:$HOME/bin
[root@localhost ~]# nusers
1
[root@localhost ~]#
要让修改永久生效,在.profile文件中把你的bin目录加入$PATH,而每次登陆时,Shell都将读取.profile文件,例如:
PATH=$PATH:$HOME/bin
在$PATH里的空项目(empty component)表示当前目录(current directory)。空项目位于路径值中间时,可以用两个连续的冒号来表示,如果将冒号直接置于最前端或者尾端,可以分别表示查找时最优先查找或最后查找当前目录:
PATH=:/bin:/usr/bin //先找当前目录
PATH=/bin:/usr/bin: //最后找当前目录
PATH=/bin:/usr/bin //当前目录居中
如果你希望将当前目录纳入查找路径(search path),更好的做法是在$PATH中使用点号(dot)
空项目在可移植性上有点问题
一般来说,你根本就不应该在查找路径中放进当前目录,因为这会有安全上的问题。
相关文章推荐
- Java笔记5 IO<1>其他对象以及IO流
- Hello Swift!<Appdelegate的生命周期以及变量定义>
- Java 中的 int 与 Integer 用于 List<Integer> 时,以及通过打印变量检测程序运行和函数调用次数计数
- centos shell基础 alias 变量单引号 双引号 history 错误重定向 2>&1 jobs 环境变量 .bash_history source配置文件 nohup & 后台运行 cut,sort,wc ,uniq ,tee ,tr ,split, paste cat> 2.txt <<EOF 通配符 glob模式 发邮件命令mail 2015-4-8 第十二节课
- Java 中的 int 与 Integer 用于 List<Integer> 时,以及通过打印变量检測程序执行和函数调用次数计数
- #include <iostream> 和#include <iostream.h> 以及include " "的区别
- C++Primer--->#include<iostream>与#include<iostream.h>以及#inclue<string> 和 #include<string.h>的区别
- <<探讨linux/unix>>之重定向
- 怎么在网页中显示'<','>'以及怎么显示'<','>'
- BugFix系列<OpenStack>----HttpURLConnection 500内部服务器错误的解决以及思考
- 获取 List<Object[]>,List<Object>,List<BreakType>中的两个变量
- <<探讨linux/unix>>之命令echo
- 初次接触dedeCMS源代码中的宏: <?php echo $cfg_templeturl; ?> {dede:global.cfg_templeturl/}
- NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>问题解决总结
- Flex4 state基本操作 以及 <fx:Reparent>标签
- #include<iostream>与#include<iostream.h>以及#inclue<string> 和 #include<string.h>的区别
- #include<iostream>与#include<iostream.h>以及#inclue<string> 和 #include<string.h>的区别
- Struts 2 <s:iterator>标签嵌套以及遍历双层List
- java.io.FileNotFoundException: Template /template/SEL00/token.ftl not found. <s:token>出错
- Struts里面<html:link>的使用方法以及加多个参数的方法