您的位置:首页 > 运维架构 > Shell

[Linux][2011-11-23] bash if 比较 # 重定向

2011-11-23 14:26 288 查看
if 语句格式:

if [ condition ]

then

action

fi

需要注意的是, bash中的大部 比较运算符、 关键字、 括号的前后都需要加空格的。

1.文件比较运算符

-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]

-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]

-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]

-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]

-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]

-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]

-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]

filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

[align=center]运算符[/align]
含义( 满足下面要求时返回 TRUE )
[align=center]-e file[/align]
文件 file 已经存在
[align=center]-f file[/align]
文件 file 是普通文件
[align=center]-s file[/align]
文件 file 大小不为零
[align=center]-d file[/align]
文件 file 是一个目录
[align=center]-r file[/align]
文件 file 对当前用户可以读取
[align=center]-w file[/align]
文件 file 对当前用户可以写入
[align=center]-x file[/align]
文件 file 对当前用户可以执行
[align=center]-g file[/align]
文件 file 的 GID 标志被设置
[align=center]-u file[/align]
文件 file 的 UID 标志被设置
[align=center]-O file[/align]
文件 file 是属于当前用户的
[align=center]-G file[/align]
文件 file 的组 ID 和当前用户相同
[align=center]file1 -nt file2[/align]
文件 file1 比 file2 更新
[align=center]file1 -ot file2[/align]
文件 file1 比 file2 更老

2.字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string 如果 string长度为零,则为真 [ -z "$myvar" ]

-n string 如果 string长度非零,则为真 [ -n "$myvar" ]

string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]

string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]

[align=center]对应的操作[/align]
[align=center]整数操作[/align]
[align=center]字符串操作[/align]
[align=center]相同[/align]
[align=center]-eq[/align]
[align=center]=[/align]
[align=center]不同[/align]
[align=center]-ne[/align]
[align=center]!=[/align]
[align=center]大于[/align]
[align=center]-gt[/align]
[align=center]>[/align]
[align=center]小于[/align]
[align=center]-lt[/align]
[align=center]<[/align]
[align=center]大于或等于[/align]
[align=center]-ge[/align]
[align=center][/align]
[align=center]小于或等于[/align]
[align=center]-le[/align]
[align=center][/align]
[align=center]为空[/align]
[align=center][/align]
[align=center]-z[/align]
[align=center]不为空[/align]
[align=center][/align]
[align=center]-n[/align]

3.算术比较运算符

num1-eq num2 等于 [ 3 -eq $mynum ]

num1-ne num2 不等于 [ 3 -ne $mynum ]

num1-lt num2 小于 [ 3 -lt $mynum ]

num1-le num2 小于或等于 [ 3 -le $mynum ]

num1-gt num2 大于 [ 3 -gt $mynum ]

num1-ge num2 大于或等于 [ 3 -ge $mynum ]

$0 这个程序的执行名字

  $n  这个程序的第n个参数值,n=1...9

  $*  这个程序的所有参数

  $# 这个程序的参数个数

  $$ 这个程序的PID

  $! 执行上一个背景指令的PID

  $? 上一个指令的返回值

4.重定向

$ find /home -name lost* 2> err_result

这个命令在 ">" 符号之前多了一个 "2","2>" 表示将标准错误输出重定向。由于 /home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在 err_result 文件中。大家可以设想一下
find /home -name lost* 2>>err_result 命令会产生什么结果?

如果直接执行 find /home -name lost* > all_result ,其结果是只有标准输出被存入 all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:

$ find /home -name lost* > all_result 2>& 1

上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能,还有一种简便的写法如下:

$ find /home -name lost* >& all_result

如果那些出错信息并不重要,下面这个命令可以让你避开众多无用出错信息的干扰:

$ find /home -name lost* 2> /dev/null

同学们回去后还可以再试验一下如下几种重定向方式,看看会出什么结果,为什么?

$ find /home -name lost* > all_result 1>& 2

$ find /home -name lost* 2> all_result 1>& 2

$ find /home -name lost* 2>& 1 > all_result


另外一个非常有用的重定向操作符是 "-",请看下面这个例子:

$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)


该命令表示把 /source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到 /dest/directory 目录下去,这个命令在 /source/directory 和 /dest/directory 不处在同一个文件系统下时将显示出特别的优势。

下面还几种不常见的用法:

n<&- 表示将 n 号输入关闭

<&- 表示关闭标准输入(键盘)

n>&- 表示将 n 号输出关闭

>&- 表示将标准输出关闭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: