显示文件权限的bash脚本给出错误的输出

我正在学习bash,并希望你们可以帮我解释下面的脚本是怎么回事

#!/bin/bash #primer if if [ -f $file1 ]; then echo "file1 is a file" else echo "file1 is not a regular file" fi #segundo if if [ -r $file1 ]; then echo "file1 has read permission" else echo "file1 doesnot have read permission" fi #tercer if if [ -w $file1 ]; then echo "file1 has write permission" else echo "file1 doesnot have write permission" fi #cuarto if if [ -x $file1 ]; then echo "file1 has execute permission" else echo "file1 doesnot have execute permission" fi 

在我看来,如果我更改文件权限并不重要,因为输出总是相同的

 fmp@eva00:~/Books/2012/ubuntu_unleashed$ ./script.sh file1 is a file file1 has read permission file1 has write permission file1 has execute permission fmp@eva00:~/Books/2012/ubuntu_unleashed$ ll file1 -rw-r--r-- 1 fmp fmp 0 Aug 30 13:21 file1 fmp@eva00:~/Books/2012/ubuntu_unleashed$ chmod 200 file1 fmp@eva00:~/Books/2012/ubuntu_unleashed$ ./script.sh file1 is a file file1 has read permission file1 has write permission file1 has execute permission fmp@eva00:~/Books/2012/ubuntu_unleashed$ ll file1 --w------- 1 fmp fmp 0 Aug 30 13:21 file1 fmp@eva00:~/Books/2012/ubuntu_unleashed$ chmod 000 file1 fmp@eva00:~/Books/2012/ubuntu_unleashed$ ll file1 ---------- 1 fmp fmp 0 Aug 30 13:21 file1 fmp@eva00:~/Books/2012/ubuntu_unleashed$ ./script.sh file1 is a file file1 has read permission file1 has write permission file1 has execute permission 

file1可以是空的,但仍然输出是相同的,做相同的testing

有人可以向我解释什么是错的?

谢谢

顺便说一句,这里的脚本是ubuntu unleashed book 2011版(Book site http://ubuntuunleashed.com/ )第233页上compare3的一个修改版本。

file1变量是未定义的。

你应该在脚本的开头添加file1="file1"

这就是你所有的测试都成功的原因:因为变量是空的,你会得到

 if [ -f ]; ... if [ -r ]; ... if [ -w ]; ... if [ -x ]; ... 

因为您使用的是单个括号,所以bash只能看到一个单词作为测试条件。 当测试命令只看到一个参数时,如果该单词不是空的,结果为真,并且在每种情况下,该单词包含2个字符。

当然,修正是声明变量。 另外,你应该使用bash的条件构造

 if [[ -f $file ]]; ... if [[ -r $file ]]; ... if [[ -w $file ]]; ... if [[ -x $file ]]; ... 

当使用双括号时,即使变量为空或空,bash也会在条件中看到2个单词。

$file1变量更改为$1或者在脚本开头(#!/ bin / bash后面)添加以下内容:

 set file1=$1 

所以你可以像这样调用你的脚本:

 ./script.sh file 

或者删除dolar标志,或用$1替换$file1并将脚本用作./script.sh file1