首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一次测试多个文件条件(BASH)?

一次测试多个文件条件(BASH)?
EN

Stack Overflow用户
提问于 2011-08-02 18:10:10
回答 5查看 49.2K关注 0票数 42

通常,在为bash编写时,需要测试文件(或目录)是否存在(或不存在)并采取适当的操作。最常见的测试是..。

-e - file存在,-f - file是一个常规文件(不是目录或设备文件),-s -文件不是零大小的,-d -文件是一个目录,-r -文件有读取权限,-w -文件有写,或者-x执行权限(对于运行测试的用户)。

这很容易被证实,如这个用户可写目录.

代码语言:javascript
运行
复制
#/bin/bash

if [ -f "/Library/Application Support" ]; then
echo 'YES SIR -f is fine'
else echo 'no -f for you'
fi

if [ -w "/Library/Application Support" ]; then
echo 'YES SIR -w is fine'
else echo 'no -w for you'
fi

if [ -d "/Library/Application Support" ]; then
echo 'YES SIR -d is fine'
else echo 'no -d for you'
fi

➝no -f给您✓

➝是的,-w先生很好,✓

➝是的,-d先生很好,✓

我的问题,虽然看起来很明显,也不可能是不可能的,但我的问题是如何简单地组合这些测试,而不必对每个条件分别执行它们……不幸的是。

代码语言:javascript
运行
复制
if [ -wd "/Library/Application Support" ]  
  ▶  -wd: unary operator expected

if [ -w | -d "/Library/Application Support" ]   
  ▶  [: missing `]'
  ▶  -d: command not found

if [ -w [ -d "/Library.... ]]   &  if [ -w && -d "/Library.... ] 
  ▶  [: missing `]'

➝no -wd给您✖

➝no -w \ -d给您✖

➝no [ -w -d .]给你的

➝no -w && -d for you✖

我在这里错过了什么?

EN

回答 5

Stack Overflow用户

发布于 2011-08-02 18:13:40

您可以对多个条件使用逻辑运算符,例如-a表示AND

代码语言:javascript
运行
复制
MYFILE=/tmp/data.bin
if [ -f "$MYFILE"  -a  -r "$MYFILE"  -a  -w "$MYFILE" ]; then
    #do stuff
fi
unset MYFILE
票数 43
EN

Stack Overflow用户

发布于 2011-08-02 19:18:41

当然,您需要像Kerrek(+1)和Ben(+1)指出的那样使用它。你可以用几种不同的方式来做。以下是几种方法的ala-microbenchmark结果:

最便携和可读的方式:

代码语言:javascript
运行
复制
$ time for i in $(seq 100000); do [ 1 = 1 ] && [ 2 = 2 ] && [ 3 = 3 ]; done
real    0m2.583s

仍可携带,可读性较低,速度更快:

代码语言:javascript
运行
复制
$ time for i in $(seq 100000); do [ 1 = 1 -a 2 = 2 -a 3 = 3 ]; done
real    0m1.681s

卑鄙,但可读性强,速度更快

代码语言:javascript
运行
复制
$ time for i in $(seq 100000); do [[ 1 = 1 ]] && [[ 2 = 2 ]] && [[ 3 = 3 ]]; done
real    0m1.285s

卑鄙,但相当可读的,而且速度最快。

代码语言:javascript
运行
复制
$ time for i in $(seq 100000); do [[ 1 = 1 && 2 = 2 && 3 = 3 ]]; done
real    0m0.934s

注意,在bash中,"[“是一个内置的,所以bash使用的是内部命令,而不是指向/usr/bin/test精确性的符号链接。"[[“]是bash关键字。所以最慢的方法是:

代码语言:javascript
运行
复制
time for i in $(seq 100000); do /usr/bin/\[ 1 = 1 ] && /usr/bin/\[ 2 = 2 ] && /usr/bin/\[ 3 = 3 ]; done
real    14m8.678s
票数 27
EN

Stack Overflow用户

发布于 2011-08-02 18:12:18

您需要-a,就像在-f foo -a -d foo中一样(实际上,这个测试可能是错误的,但是您知道了)。

您与&关系密切,您只需要&&,就像在[ -f foo ] && [ -d foo ]中一样,尽管这会运行多个命令而不是一个命令。

下面是a manual page for test,它是[链接到的命令。test的现代实现有更多的特性(还有shell内置版本[[,它在您的shell的手册中有文档)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6916559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档