В сценарии есть ряд неправильных вещей, и до сих пор указывались только самые очевидные вещи (вам нужно вызвать $ MYPERMISSIONS, чтобы передать его в grep, вам не нужны лишние экранирования и тому подобное в строка разрешений, и вам нужно заключить в кавычки или пробелы в имени файла). Есть также некоторые более тонкие проблемы, в основном из-за опасности анализа вывода ls . Предположим, например, что в вашем рабочем столе есть файл с именем «Not My File.txt» - начальный ls | grep | wc
будет соответствовать этому, и выведите «My File.txt Exists», даже если это не так ( еще более странно, если существует и то и «My File.txt». Во-вторых, предположим, что файл существует и принадлежит «notroot» - скрипт будет считать, что является владельцем root, поскольку в списке ls содержится «root». В-третьих, предположим, что его группа - "-rwxr-xr-x" (совершенно допустимое имя группы, по крайней мере, в некоторых системах) ...
Вместо этого, чтобы проверить, существует ли файл, используйте примитив -e
тестовой команды. Чтобы проверить владельца и разрешения, stat
дает вам намного лучше себя вести.
Наконец, вместо использования избыточных команд if
(если файл существует ... и затем, если файл не существует ...), используйте предложение else
для одной команды if
. После исправления всего этого (и небольшой незначительной очистки, такой как помещение имени файла в переменную), вот как я переписал скрипт:
cd ~/Desktop
filename="My File.txt"
if [ -e "$filename" ];
then
echo "My File.txt Exists"
if [ "$(stat -f "%Sp" "$filename")" = "-rwxr-xr-x" ]; then
echo "Permissions are correct for My File.txt"
else
echo "Permissions are NOT correct for My File.txt"
fi
if [ "$(stat -f "%Su" "$filename")" = "root" ]; then
echo "Owner is correct for My File.txt"
else
echo "Owner is NOT correct for My File.txt"
fi
else
echo "My File.txt does NOT Exist"
fi