2015-04-12 1 views
0

Получив мой чек для работы с файлами и dirs, я решил разбить их на отдельные функции и вместо этого сделать вызовы. Что я делаю не так? И жаль, что задал столько вопросов в последнее время.bash - что я делаю сейчас неправильно?

function checkForFilesInCurrentDir(){ 
    # check if there are files in the current directory 
    doFilesExist=`find . -maxdepth 1 -type f` 
    if [ -z "$doFilesExist" ]; then 
     echo "no files" 
     return 0 
    else 
     echo "some files" 
     return 1 
    fi 
} 

function checkForDirsInCurrentDir(){ 
    # check if there are dirs excluding . and .. in the current directory 
    doDirsExist=`find . -mindepth 1 -maxdepth 1 -type d` 
    if [ -z "$doDirsExist" ]; then 
     echo "no dirs" 
     return 0 
    else 
     echo "some dirs" 
     return 1 
    fi 
} 
# function to cd to the next non-empty directory or next branching directory 
function cdwn(){ 
    # check if there are files in current dir 
    filesInDir=`checkForFilesInCurrentDir` 
    dirsInDir=`checkForDirsInCurrentDir` 
    if [[ "$filesInDir" -eq 1 ]] && [[ "$dirsInDir" -eq 1 ]]; then 
     echo "now is a good time to cd" 
    else 
     echo "dirs or files detected" 
    fi 
} 

до моего возвращения истина/ложь и тестирование в Teh таким же образом, но я изменил возвращения 1/0 на всякий случай, но это не кажется, проблема. Это занимает больше времени, чем это когда-либо спасет меня от его использования, поэтому мне нужно убедиться, что я узнаю из этого, поэтому мои будущие начинания - это более быстрые дела ...

Я получаю следующий вывод при запуске программы. sh.exe ": [[: нет файлов: ошибка синтаксиса в выражении (маркер ошибки„файлы“) или каталоги файлов, обнаруженных

я, возможно, следует упомянуть, что я на окнах 7 с помощью мерзавец Баш терминал

+0

Не приносите извинения за задание вопросов, пока вы 1: тщательно рассмотрели решение самостоятельно и 2: задайте свой вопрос в ясной форме. Ваш вопрос не так ясен, старайтесь быть более точным и старайтесь всегда включать * минимальный * код. К этому последнему предложению я хочу включить код, но не все, только соответствующие части или, в идеале, минимальный пример, в котором вы можете воспроизвести аномалию. – ShellFish

+0

Я не знаю, что случилось, поэтому я не знаю минимального количества необходимого кода ... Я звоню в 2 функции. Один проверяет, есть ли файлы в текущем каталоге, а другой - для каталогов, исключая. и .. Я думаю, проблема в функции cwdn, так как две другие, безусловно, работают сейчас.В настоящее время я очень хочу распечатать сообщение, если в текущем рабочем каталоге нет файлов или dirs, или распечатать сообщение, в котором указаны файлы или файлы, обнаруженные иначе ... – user122072

+0

Кстати, если вы используете 'find -mindepth 1', вы не найдет '.' и' ..', поэтому вы также можете проверить его с помощью '[-z ...]'. – ShellFish

ответ

1
.

Вы должны, вероятно, сделать что-то подобное в cdwn

function cdwn { 
    # check files in dir and output immediately 
    checkForFilesInCurrentDir 
    # store the return value 
    ret="$?" 

    # check for dirs in dir and output 
    checkForDirsInCurrentDir 

    if [[ $ret -eq 0 ]] && [[ $? -eq 0 ]]; then 
     echo success 
    else 
     echo "at least one failed" 
    fi 
} 

Вы можете проверить статус выхода последней вызываемой функции путем доступа к оболочке предопределённые $?. Это может, вероятно, будет большим подспорьем для вас!

О, и кстати: попытаться выйти с помощью кода 0 на успех и использовать другие целые числа на наличие ошибок и т.д.

Дальнейшее объяснение

Вы пытались проверить статус выхода вызываемой функции (т.е. возвращаемое значение ), они хранятся в оболочке, встроенной в $?. Вместо этого вы определили свои переменные следующим образом: variable=$(some command). Это поместит весь вывод функции или команды внутри переменной.

Например: при использовании var=$(ls) будут храниться все файлы и папки в переменной var. Но команда заканчивается exit 0, которая не отображается как выход, поэтому ее невозможно получить с var. Этот статус выхода сохраняется в $?.

В вашем случае вы сохранили вывод checkForFilesInCurrentDir переменной. Поскольку ваша функция перекликается с «некоторыми файлами» или «без файлов», это содержимое вашей переменной, а не код выхода. Поэтому вам нужно было проверить [[ $filesInDir = "some files" ]], чтобы проверить, найдены ли файлы. Но лучше использовать код выхода, который хранится в $?. Таким образом, если эхо изменяется или вы добавляете другое эхо в функцию, вам не придется переписывать структуру управления.

+0

Почему я не должен хранить результаты вызова в переменной? Я считаю, что это более понятно. – user122072

+0

Поскольку вы все равно собираетесь выводить его, если вы этого не сделали, вы все равно не сохранили бы его, а передали вывод на '/ dev/null'. Даже когда вы намереваетесь показать часть этого, вам все равно будет лучше переходить на «grep», 'awk' или' sed'. Это может быть более понятно для вас, но это не лучшая практика, я думаю. Посмотрите, как мой код намного короче, например? – ShellFish

+0

Вы также сохраняете выходные данные других команд в переменных? Например. 'var = $ (ls -l)', чтобы показать его позже как 'echo $ var'? Нет почему? Потому что это слишком много. Если вы это сделаете, вы даже можете сделать это: 'var = $ (echo 'hello'); echo $ var', что абсурдно. – ShellFish

Смежные вопросы