#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?