2014-02-13 3 views
0
#!/bin/bash 

traverse() { 
local x=$1 
if [ -d $x ] 
then 
lst=(`ls $x`) 
for((i=${#lst[@]}; --i;)); do 
    echo "${lst[i]}" 
    done 
else echo "not a directory" 
fi 
} 

traverse 

Я хочу передать параметр, такой как «/ путь/к/это/директории /» при выполнении программы, но работает только если я запустить программу в том же каталоге, что и мой файл Баш скрипт и любой другой параметр I pass полностью игнорируется.Баш, передающий аргументы/параметры?

сценарий должен принимать параметр и проверять, является ли он каталогом, и если это каталог, то список всех файлов/папок в порядке убывания. Если не отображается сообщение об ошибке.

Что не так с кодом, спасибо!

ответ

3

Это происходит потому, что $1 в функции относится к параметрам traverse, а не параметрам вашего скрипта.

Чтобы запустить функцию только один раз с каждым аргументом, используйте

for arg in "[email protected]" # "[email protected]" is also the default, so you can drop the 'in ..' 
do 
    traverse "$arg" 
done 

Если вы в будущем хотите передать все параметры скрипта на функцию, используйте

myfunc "[email protected]" 

Это просто проблема под рукой. Другие проблемы включают не цитирование ваших переменных и использование расширения команд ls, lst=(`ls $x`), а не глобусов, lst=("$x"/*)

+0

@ [этот другой парень] благодарит очень полезную информацию! теперь работает так, как я ожидал! – user3016065

3

Для этого не нужно звонить ls. Вы можете использовать этот код:

traverse() { 
    local x="$1" 
    if [ -d "$x" ]; then 
     arr=("$x/"*) 
     for ((i=${#arr[@]}; i>0; i--)); do 
      echo "${arr[$i]}" 
     done 
    else 
     echo "not a directory" 
    fi 
} 
0

«Этот другой парень» имеет правильный ответ. Причина всегда смотрит на текущей директории:

  1. вы вызываете traverse без аргументов
  2. $1 в балке функции пуст, поэтому $x пуст
  3. тест поэтому [ -d ], и когда [ задан 1 аргумент, он возвращает успех, если аргумент не пуст. Ваша команда if всегда выполняет «истинный» блок и ls $x просто ls когда х пусто

Использование [[ ... ]] с Баш: она умнее о пустых аргументов. В противном случае укажите ваши переменные:

$ x=; [ -d $x ] && echo always true || echo not a directory 
always true 
$ x=; [[ -d $x ]] && echo always true || echo not a directory 
not a directory 
$ x=; [ -d "$x" ] && echo always true || echo not a directory 
not a directory 
Смежные вопросы