Почему может не работать bash скрипт
Создал простой скрипт, который должен искать названия из 1 файла в другом, если он не нашел название, то должен удалять строку из 1 файла. А после всего скопировать то, что осталось в 3 файл.
#!/bin/bash
name1=sitelist1;
name2=sitelist2;
strfile1=$(wc -l $name1);
strfile1=$(echo $strfile1 | tr -d $name1);
for((i=1; i < strfile1; i++)) do
str=$(head -n $i $name1 | tail -n 1);
numb_str=$(grep $str $name2);
if [[ -n $numb_str ]]; then
echo "1";
if [[ $i -ge $strfile1 ]]; then
sed '/^$/d' $name1;
sed '/./!d' $name1;
cp $name1 sitelist3.txt;
fi
else
line=$(echo $i'd');
echo "0";
#delete string
sed $line $name1;
if [[ $i -ge $strfile1 ]]; then
sed '/^$/d' $name1;
sed '/./!d' $name1;
cp $name1 sitelist3.txt;
fi
fi
done
Ответы (1 шт):
Автор решения: ipatev_nn
→ Ссылка
Попробуем разобраться:
#!/bin/bash
name1=sitelist1;
name2=sitelist2;
strfile1=$(wc -l $name1);
strfile1=$(echo $strfile1 | tr -d $name1);
#Лишнее переобъявление переменной, возможно выполнить
#strfile1=$(wc -l $name1 | tr -d $name1);
for((i=1; i < strfile1; i++)) do
str=$(head -n $i $name1 | tail -n 1);
#Не известно что в файле, если могут быть пробелы, то следует использовать экранирование кавычкой "
numb_str=$(grep "$str" $name2);
#___________________^____^_________
if [[ -n $numb_str ]]; then
echo "1";
if [[ $i -ge $strfile1 ]]; then
sed '/^$/d' $name1;
sed '/./!d' $name1;
#две команды выше просто выводят значения в терминал, не изменяя сам файл
#возможно пропущен ключ -i
cp $name1 sitelist3.txt;
fi
else
line=$(echo $i'd');
#echo здесь не нужно, сработает и так:
#line=${i}d
echo "0";
#delete string
sed $line $name1;
#Опять же отсутствие у sed ключа -i не вносит никаких изменений в файл
if [[ $i -ge $strfile1 ]]; then
sed '/^$/d' $name1;
sed '/./!d' $name1;
#аналоигчная проблема, возможно пропущен параметр -i
cp $name1 sitelist3.txt;
fi
fi
done
По итогу скрипт никак не меняет содержимое файлов, а лишь печатает их в stdout, если изменения нужно вносить в файл, то воспользуйтесь параметром программы sed, -i который перезаписывает файл с новыми значениями