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

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

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

这很容易证实,就像在这个用户可写目录中显示的那样....

#/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

➝没有-f为你✓
➝YES SIR -w很好✓
➝YES SIR -d很好✓

我的问题虽然看起来很明显,也不可能是不可能的,但是如何简单地结合这些测试,而不必为每种情况分别执行它们......不幸的是......

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给你✖
➝否[-w [-d ..]]给你✖
➝no -w && -d为你✖

我在这里错过了什么?


您可以将逻辑运算符用于多个条件,例如-a用于AND

MYFILE=/tmp/data.bin
if [ -f "$MYFILE"  -a  -r "$MYFILE"  -a  -w "$MYFILE" ]; then
    #do stuff
fi
unset MYFILE

当然,你需要以某种方式使用AND,因为Kerrek(+1)和Ben(+1)指出了它。 你可以用几种不同的方式做。 以下是几种方法的ala-microbenchmark结果:

最便携和可读的方式:

$ time for i in $(seq 100000); do [ 1 = 1 ] && [ 2 = 2 ] && [ 3 = 3 ]; done
real    0m2.583s

仍然便携,不易读,速度更快:

$ time for i in $(seq 100000); do [ 1 = 1 -a 2 = 2 -a 3 = 3 ]; done
real    0m1.681s

抨击,但可读性和速度更快

$ time for i in $(seq 100000); do [[ 1 = 1 ]] && [[ 2 = 2 ]] && [[ 3 = 3 ]]; done
real    0m1.285s

抨击,但很可读,最快。

$ time for i in $(seq 100000); do [[ 1 = 1 && 2 = 2 && 3 = 3 ]]; done
real    0m0.934s

注意,在bash中,“[”是内建的,所以bash使用内部命令而不是/ usr / bin / test exacutable的符号链接。 “[[”是一个bash关键字。 所以最慢的方法将是:

time for i in $(seq 100000); do /usr/bin/[ 1 = 1 ] && /usr/bin/[ 2 = 2 ] && /usr/bin/[ 3 = 3 ]; done
real    14m8.678s

你需要-a-f foo -a -d foo (实际上那个测试是错误的,但你明白了)。

你和&只需要&&就像在[ -f foo ] && [ -d foo ]尽管它运行多个命令而不是一个。

这是一个测试的手册页,它是[链接到的]命令。 test现代实现有更多的功能(以及shell-built版本[[在shell的联机帮助页中记录])。

链接地址: http://www.djcxy.com/p/24131.html

上一篇: Test multiple file conditions in one swoop (BASH)?

下一篇: How to check if a file exists in a shell script