2013-04-01 2 views
0
#!/bin/bash                                        
menu=0 
dir="" 
size="" 
name="" 
modif="" 
while [ $menu -ne 6 ] 
do 
    echo "1. Name: $name" 
    echo "2. Directory $dir" 
    echo "3. Last modified: $modif" 
    echo "4. Minimum size: $size" 
    echo "5. Search" 
    echo "6. End" 
    read menu 
    case "$menu" in 
     "1") read name ;; 
     "2") read dir ;; 
     "3") read modif ;; 
     "4") read size;; 
     "5") if [ -z $name ] 
      then 
       option1="" 
      else 
       option1="-name $name" 
      fi 
      find "$option1";; 
     "6") ;; 
     *) echo "Wrong number!" 
    esac 
done 

Мне нужно создать скрипт, который будет работать как команда find, но я столкнулся с проблемой. Когда пользователь не вводит имя примера, команда find должна иметь параметр имени.bash find parameters

Я придумал что-то подобное выше, но он doestn работает, когда имя переменной не содержит ничего (пользователь ничего не вводил). Я продолжаю получать ошибку: find: пути должны предшествовать выражению: BASH ....

Я честно понятия не имею, как заставить его работать вместо того, чтобы иметь 2^4 IF и выполнять поиск только с указанными опциями, которые пользователь имеет Выбирается.

Есть ли способ облегчения?

редактировать: Теперь я изменил его на:

#!/bin/bash                                        
menu=0 
dir="" 
modif="" 
while [ $menu -ne 6 ] 
do 
    echo "1. Name: $name" 
    echo "2. Directory $dir" 
    echo "3. Last modified: $modif" 
    echo "4. Minimum size: $size" 
    echo "5. Search" 
    echo "6. End" 
    read menu 
    case "$menu" in 
     "1") 
      read name 
      ;; 
     "2") read dir ;; 
     "3") read modif ;; 
     "4") 
      read size 
      ;; 
     "5") 
      if [ -z $name ] 
     then 
      unset tablica[0] 
     else  
      tablica[0]="-name $name" 
     fi   
     find "${tablica[@]}" 
     ;; 
    "6") ;; 
    *) echo "Wrong number!" 
esac 
done 

Но другая ошибка:

находке: неизвестный предикат `-name«example.txt

+0

Это 'if [-z $ name]' должно быть 'if [-z" $ name "]', строго, хотя 'test' (aka' [') может компенсировать отсутствующий аргумент. –

+0

use 'tablica [0] =" - name "; tablica [1] = "$ имя"; 'или гораздо удобнее,' tablica + = (- name "$ name") '. –

ответ

0

Вы можете создать массив параметров:

myarray=() 
if [[ $size ]] 
then 
    myarray+=(-size +"$size") 
fi 

if [[ $name ]] 
then 
    myarray+=(-name "$name") 
fi 
... 
find "$dir" "${myarray[@]}" 

Преимущество этого подхода состоит в том, что он также правильно обрабатывает пространства, а сам Не допускать ввода кода.

+0

Но будет ли это работать должным образом, если у меня когда-то есть набор имен, скажем example.txt, а затем без выхода из программы я меняю его, нажимая 1 на else.txt. Как я вижу, он добавит новый элемент в массив, так что теперь у него будут два одинаковых элемента: -name example.txt и -name else.txt – 2013-04-01 18:00:19

+0

Вы сделали бы это в своем случае «5», когда вы действительно хотите запустить find, после того, как переменные были прочитаны и изменены столько раз, сколько пользователь хочет. –

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