Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 测试条件外壳脚本_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux 测试条件外壳脚本

Linux 测试条件外壳脚本,linux,bash,shell,unix,Linux,Bash,Shell,Unix,因此,我正在编写一个脚本,在执行之前必须检查文件是否存在。我有以下代码: if [[ \( -d "DIR2" \) != true ]]; then echo "nonexistent dir" exit 1 elif [[ \( -d "DIR1" || -f "DIR1" \) != true ]]; then echo "nonexistent dir or file" exit 1 fi 我似乎对括号做了一些错误的处理,因为我得到了以下信息: ./sy

因此,我正在编写一个脚本,在执行之前必须检查文件是否存在。我有以下代码:

if [[ \( -d "DIR2" \) != true ]];
then
    echo "nonexistent dir"
    exit 1
elif [[ \( -d "DIR1" || -f "DIR1" \) != true ]];
then
    echo "nonexistent dir or file"
    exit 1
fi
我似乎对括号做了一些错误的处理,因为我得到了以下信息:

./syncdir.sh: line 11: conditional binary operator expected
./syncdir.sh: line 11: syntax error near `-d'
./syncdir.sh: line 11: `if [[ \( -d "DIR2" \) != true ]];'
我觉得奇怪的是bash期望一个二进制运算符不是“!=”一个?
谁能告诉我我做错了什么,为什么



我真的被括号弄糊涂了,我还没有掌握它的窍门。

你的条件语法完全错误。应该是:

if [[ -d "DIR2" ]];


如果条件表达式中有括号,则不需要对其进行转义(只有在使用
[
命令时才需要转义)。并且不需要与启动条件的
true
false

进行比较。然而,您所做的是不好的做法,因为您的代码(即使在工作时)是错误的是一个完美的竞争条件。如果文件夹不存在,您最好访问该文件夹并处理错误。它如何创建竞争条件?@MiguelM竞争条件是:您的测试成功,因为目录存在,然后其他进程删除该目录,然后您的进程尝试使用不再存在的目录存在。我应该如何正确处理此问题?感谢前面的解释BTW@MiguelM如我所说,只需访问该文件夹。如果该文件夹不存在,您将得到一个可以处理的错误。对于简单的情况,这是可以的。更复杂的方法是使用flock锁。因此我可以在[[]中使用括号?但首先是什么导致了错误?错误是因为您转义了括号。因此它将它们视为文字字符串,而不是表达式语法的一部分。即使我采用()它给了我一个错误,您给我的解决方案也不起作用:/但是我想我可以让它起作用。我的目标是检查DIR1是否是一个文件或目录,DIR2是否只是一个目录。@Barmar-对于条件表达式何时使用
[
[
有任何规范吗?请告知。
[[
是一个
bash
zsh
扩展,
[
是POSIX标准。但是如果不需要移植到所有POSIX shell,
[
通常更快、更易于使用。请参阅
if [[ ! ( -d "DIR1" ||  -f "DIR1" ) ]];