true
и false
— это команды, которые завершаются с кодами успешного и неудачного завершения соответственно. Они не заставляют вашу функцию возвращать эти значения, для этого используйте команду return
и целочисленные значения, соответствующие успеху (0 )или сбою (что-либо отличное от 0 ). Кроме того, я почти уверен, что вы не хотите возвращать отказ для первой строки, которая не соответствует, только если нет строки, совпавшей:
check(){
file=/root/Turkiye.txt
local funkx=$1
while read line; do
if [ "$line" == "$funkx" ]
then
return 0 # 0 = success ("true"); break is not needed because return exits the function
fi
done < $file
# If a line matched, it won't get here (it will have returned out of the middle
# of the loop). Therefore, if it gets here, there must not have been a match.
return 1 # 1 = failure ("false")
}
Но есть гораздо более простой способ сделать это. Используйте grep
--, его работа заключается в поиске в файлах совпадающих строк. Вы хотитеgrep -Fxq
---F
означает поиск фиксированных строк (не шаблонов регулярных выражений ), -x
означает, что требуется совпадение всей строки, а не только ее части, а -q
означает, что не нужно печатать результат, просто выйдите со статусом успеха, если совпадение было найдено, в противном случае произойдет сбой. И даже не нужна явная команда return
, так как функция будет неявно возвращать статус последней команды в ней:
check(){
file=/root/Turkiye.txt
local funkx=$1
grep -Fxq "$funkx" "$file"
}
Или еще проще:
check(){
grep -Fxq "$1" /root/Turkiye.txt
}
Предположительно происходит то, что с конструкцией -exec... \;
find делает свою работу шаг за шагом:
-type d
и rmdir
для таких записей, как только они будут найдены. Это означает, что в вашем примере find будет смотреть на dir01
, сохраните его иметь в виду как каталог, чтобы войти позже, затем запустить rmdir
на нем, и затем, при попытке рекурсии в dir01
, потерпеть неудачу, потому что это не существуют больше.
Запуск с -exec rmdir {} +
должен помочь в этом случае :будет отправлен вызов rmdir dir01 dir02 dir03
. Это избавляет от последние три сообщения об ошибках.
Сообщение об ошибке .
связано с тем, что .
текущий каталог действительно является каталогом, но не тем, который rmdir
может удалить, потому что он не пустой. Используйте -min-depth
, чтобы перестать думать об этом, выполнение команды:
find -mindepth 1 -type d -exec rmdir {} +
Это несовершенно; вложенные каталоги или большое количество совпадающих каталоги могут по-прежнему вызывать вывод сообщений об ошибках, но это должно работать в простом случае из вопроса.