логическое выражение в bash

#bash #scripting

#bash #написание сценариев

Вопрос:

Цель сценария — просмотреть файл, содержащий список имен каталогов, и добавить к другим именам каталогов файлов, которые не существуют в.

 #!/bin/bash
FILES="list.txt"
2nd_file="2nd_list.txt"
for f in $FILES
do
    # if  backup dir exists, read next dir
if [ /bin/grep -q $f $2nd_file ]
then
    echo "Skiping $f file..."
    continue  # read next file
fi
    # we are hear means no file exists
    echo "$f" >>$2nd_file
done
  

Я получаю ошибки в выражении if.

Я понял, о чем ваши ответы, и изменил сценарий :

  #!/bin/bash
 FILES="list.txt"
 2nd_file="2nd_list.txt"
 for f in $FILES
 do
        # if  backup dir exists, read next dir
 /bin/grep -q $f $2nd_file
 if [ $? -eq 0 ]
 then
    echo "Skiping $f file..."
    continue  # read next file
fi
    # we are hear means no dir exists
     echo "$f" >>$2nd_file
done
  

Но теперь небольшая проблема в том, что скрипт не считывает имена каталогов из ФАЙЛОВ

Вывод является :

  Skiping list.txt file...
  

Комментарии:

1. Вы, вероятно, имели в виду >>$2nd_file , а не >>2nd_file

Ответ №1:

ваше выражение if должно быть:

 if  /bin/grep -q $f $2nd_file
  

без квадратных скобок

ОТРЕДАКТИРОВАНО так же, как вы редактировали свой пост:

Ваш сценарий должен быть:

 #!/bin/bash
FILES="list.txt"
2nd_file="2nd_list.txt"
for f in $(cat $FILES) # see the modification
do
    # if  backup dir exists, read next dir
if /bin/grep -q $f $2nd_file # see the modification
then
    echo "Skiping $f file..."
    continue  # read next file
fi
    # we are hear means no file exists
    echo "$f" >>$2nd_file
done
  

Изменения, которые я внес, следующие:

  • в поле «для»: вам нужно содержимое архива $FILE, а не строка «list.txt » (значение переменной $ FILES), поэтому вам нужно выгрузить это содержимое с помощью cat или с помощью «<» (т. Е.: while read f; do ... ; done < $FILES )

  • в инструкции if: вы должны оценить команду. Команда — это ваш grep. Если grep вернет 0, то ваши действия с «if» будут выполнены; любое другое возвращаемое значение пропустит ваш оператор if. (это похоже на вашу бесполезную проверку статуса возврата, но более эффективно)

Ответ №2:

[ является командой. Если вы пытаетесь использовать grep в качестве команды, то не используйте [ .

Комментарии:

1. Спасибо, но если я хочу проверить, равен ли результат grep 0 или 1, например, if /bin/ grep -q $ f $ 2nd_file == 1?