2014-01-07 2 views
0
#!/bin/bash 

echo "Enter the search string" 
read str 

for i in `ls -ltr | grep $str > filter123.txt ; awk '{ print $9 }' filter123.txt` ; do 

if [ $i != "username_list.txt" || $i != "user_list.txt" ] ; then 

else 
rm $i 
fi 
done 

Я начинающий scixping оболочки unix, создаю файл выше для удаления файла на основе данной строки, используя метод grep. в то время как я выполняю над файлом сценария, он показывает ошибку, например: ./rm_file.txt: строка 10: синтаксическая ошибка около неожиданного токена `else '. пожалуйста, укажите, что является ошибкой в ​​этом скрипте.Unix, если ошибка состояния внутри для цикла

+1

Почему вы используете 'grep' и' awk' и временный файл? Просто сделайте 'ls -ltr | awk "/ $ str/{print \ $ 9}" (Это не удастся, если str содержит определенные символы, но также делает 'grep $ str') –

+0

Используйте' [[]] '(см. http: //mywiki.wooledge. орг/BashPitfalls # A.5B_.24foo_.3D_.22bar.22_.5D). Также не знаете, почему вы пытаетесь «if! A || ! b, а затем ничего другого, кроме логически эквивалентного 'if a && b then something'. – BroSlow

ответ

1

между then и else нет ничего, если вы хотите ничего не делать, вы можете положить : там

удалять файлы в текущем режиссера с определенной строки в имени, вы можете использовать find

#!/bin/bash 
read -p "Enter the search string: " str 

# to exclude "username_list.txt" and "user_list.txt" 
find . -maxdepth 1 -type f -name "*$str*" -a -not \(-name "username_list.txt" -o -name "user_list.txt" \) | xargs -I'{}' ls {} 
+0

ya .. сейчас он работает .. –

1

Чтобы использовать логический оператор с [, вы можете использовать один из:

if [ "$i" != username_list.txt ] && [ "$i" != user_list.txt ] ; then ... 
if [ "$i" != username_list.txt -a "$i" != user_list.txt; then ... 

Но в данном случае, это, вероятно, чище использовать случай Постулаты:

case "$i" in 
username_list.txt|user_list.txt) : ;; 
*) rm "$i";; 
esac 
3

Есть несколько проблем с кодом:

  1. Don't parse the output of ls. Хотя он может работать много времени, он будет ломаться для определенных имен файлов, и есть более безопасные альтернативы.

  2. Заменить filter123.txt другой трубкой.

  3. Вы можете отменить состояние выхода условия, так что вам не нужен пункт else.

  4. Ваше условие if всегда верно, поскольку любое имя файла будет неравным с одним из двух вариантов. Вероятно, вы хотите использовать &&.

  5. || и && не доступны внутри [ ... ]. Используйте либо две команды [ ... ], либо используйте [[ ... ]].

Обращаясь пунктов выше:

for i in *$str*; do 
    if [[ $i != username_list.txt && $i = user_list.txt ]]; then 
     rm "$i" 
    fi 
done 
1

Она также может быть сделано с find:

find . -maxdepth 1 -type f -name "*$str*" ! -name username_list.txt ! -name user_list.txt -exec rm {} \; 
Смежные вопросы