Bash script, показывающий права доступа к файлам, дает неправильный вывод

Я изучаю bash и хочу, чтобы вы, ребята, могли мне помочь, что происходит со следующим script

#!/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 может быть пустым или нет и все равно выводить то же самое, делая тот же тест

Кто-нибудь может объяснить мне, что не так?

Спасибо

BTW script здесь представляет собой модифицированную версию compare3 на стр. 233 выпущенной книги unbashed book 2011 (книжный сайт http://ubuntuunleashed.com/)

4 ответа

file1 переменная undefined.

вы должны добавить в начале своего script file1="file1"


Вот почему все ваши тесты преуспевают: поскольку переменная имеет значение null, вы получаете

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 слова в условии, даже если переменная пуста или null.


Измените переменную $file1 для $1 или добавьте следующее в начале script (после #!/bin/bash):

set file1=$1

Итак, вы можете вызвать свой script следующим образом:

./script.sh file


или удалите знак долара или замените $file1 на $1 и используйте script как ./script.sh file1

licensed under cc by-sa 3.0 with attribution.