Сравнение строк из вложенных для возвратов всегда ложно - PullRequest
0 голосов
/ 14 января 2019

Основная проблема заключается в том, что я пытаюсь разобрать ls, чтобы выполнить макет «Сравнить каталоги», но когда я делаю это, так как я использую вложенные форы, я не могу правильно сравнить результаты из него, так как сравнение двух имен файлов / строк, даже если они одинаковы всегда возвращает false

Я пытался стереть белые символы, но безрезультатно.

var1=$(ls -l $1 | grep -v ^d | tail -n +2 | tr -s " "| cut -d " " -f 9)
var2=$(ls -l $2 | grep -v ^d | tail -n +2 | tr -s " "| cut -d " " -f 9)

for i in $var1 ; do
    i=$(printf "$i" | tr -d '[:space:]')
    flag=0
    var3=$(ls -l $1 | grep -v ^d | tail -n +2 | tr -s " " | grep $i | cut -d " " -f 5)
        for j in $var2 ; do
        j=$(printf $j | tr -d '[:space:]')
                var4=$(ls -l $2 | grep -v ^d | tail -n +2 | tr -s " " | grep $j | cut -d " " -f 5)
                if [ "$i" == "$j" ] ; then
                        if [ "$var3" != "$var4" ] ; then
                                flag=1
                        fi
                else
            flag=1
        fi
        done
    if [ $flag -eq 1 ] ; then
        printf "$i file does not exist on the $2 catalog\n"
        printf "It 's size is :$var3 \n"
        let Sum=$Sum+$var3
    fi
done

1 Ответ

0 голосов
/ 14 января 2019

Это не проблема сравнения строк, это логическая проблема.

Я написал вам MCVE , который демонстрирует ту же проблему с меньшим количеством кода и меньшим количеством зависимостей:

flag=0
target="hello"
for candidate in "hello" "world"
do
    if [ "$target" != "$candidate" ]
    then
      flag=1
    fi
done
if [ "$flag" -eq 1 ]
then
  echo "The string was not found"
fi

Это печатает The string was not found каждый раз, так же, как ваш сценарий, даже если он явно там.

Проблема здесь в том, что сценарий требует, чтобы ВСЕ файлы совпадали. Это должно только требовать, чтобы ЛЮБОЙ файл соответствовал. Самый простой способ исправить это:

  1. Установить flag=1 при обнаружении совпадения (не несоответствие)
  2. Сделать flag=1 означать, что совпадение найдено (а не найдено)

Вот версия, которая правильно находит строку:

flag=0
target="hello"
for candidate in "hello" "world"
do
    if [ "$target" = "$candidate" ]
    then
      flag=1
    fi
done
if [ "$flag" -eq 1 ]
then
  echo "The string was found"
else
  echo "The string was not found"
fi
...