[Linux][2011-11-23] bash if 比较 # 重定向
2011-11-23 14:26
288 查看
if 语句格式:
if [ condition ]
then
action
fi
需要注意的是, bash中的大部 比较运算符、 关键字、 括号的前后都需要加空格的。
-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 ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
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 号输出关闭
>&- 表示将标准输出关闭
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 号输出关闭
>&- 表示将标准输出关闭
相关文章推荐
- Linux Bash Shell高级重定向操作--深入了解标准错误输出和标准输出
- Linux Bash Shell学习(九):流程控制——if/else
- Linux学习 —bash的I/O重定向和管道
- Linux新手之路 - bash shell for if...else
- Linux--Shell 编程-bash,命令替换,if分支嵌套,运算,输入输出
- linux bash shell 流程控制(if/else )
- 谢烟客---------Linux之bash脚本编程---if补充和for循环
- Linux目录结构、bash的基础特性、I/O重定向及管道
- Linux 技巧: Bash 测试和比较函数
- linux笔记 第三天 Linux目录及文件管理、用户组管理及bash重定向
- linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结
- Linux学习命令汇总四——Bash中变量.文件通配符.管道与重定向.算术运算及循环或判断语句
- linux shell bash 比较操作
- linux bash bc awk 浮点 计算 比较
- linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结
- Linux 技巧: Bash 测试和比较函数
- bash:ifconfig commond not found in linux
- linux grep egrep fgrep bash条件判断 bash测试 if 条件判断
- Linux基础入门及系统管理01-bash脚本编程之二if等条件判断脚本知识17
- Linux&nbsp;bash和profile比较