Я хочу сравнить переменную с файлами в каталоге и вывести равно - PullRequest
2 голосов
/ 30 августа 2010

Я делаю bash-скрипт, в котором я хочу найти файлы, равные переменной. Затем будут использованы равные.

Я хочу использовать «mogrify», чтобы уменьшить пару файлов изображений, имена которых совпадают с именами, которые я собираю из списка (аналогично «dpkg -l»). Это не «dpkg -l», который я использую, но это похоже. Моя проблема в том, что он печатает все файлы, а не только равные. Я почти уверен, что это можно сделать с помощью awk вместо цикла for, но я не знаю, как.

prog="`dpkg -l | awk '{print $1}'`"

for file in $dirone* $dirtwo*
do
     if [ "basename ${file}" = "${prog}" ]; then
         echo ${file} are equal
     else
         echo ${file} are not equal
     fi
done

Не могли бы вы помочь мне заставить это работать?

Ответы [ 3 ]

1 голос
/ 30 августа 2010

Условие "$file = $prog" является одной строкой. Вы должны попробовать "$file" = "$prog" вместо.

Следующая расшифровка показывает исправление:

pax> ls -1 qq*
qq
qq.c
qq.cpp

pax> export xx=qq.cpp

pax> for file in qq* ; do
         if [[ "${file} = ${xx}" ]] ; then
             echo .....${file} equal
         else
             echo .....${file} not equal
         fi
     done
.....qq equal
.....qq.c equal
.....qq.cpp equal

pax> for file in qq* ; do
         if [[ "${file}" = "${xx}" ]] ; then
             echo .....${file} equal
         else
             echo .....${file} not equal
         fi
     done
.....qq not equal
.....qq.c not equal
.....qq.cpp equal

В последнем бите вывода видно, что только qq.cpp отображается как равный, поскольку он соответствует только ${xx}.

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

pax> if [[ "" ]] ; then
         echo .....equal
     fi

pax> if [[ "x" ]] ; then
         echo .....equal
     fi
.....equal

Это потому, что эта форма является проверкой длины строки. Из справочной страницы bash под CONDITIONAL EXPRESSIONS:

string
-n string
True if the length of string is non-zero.


Обновление:

Новый код в вашем вопросе не будет работать должным образом. Вам нужно:

if [[ "$(basename ${file})" = "${prog}" ]]; then

на самом деле выполнить basename и использовать его вывод в качестве первой части проверки на равенство.

0 голосов
/ 30 августа 2010

Во-первых, я думаю, что есть небольшая опечатка. У if [ "basename ${file}" =... должны быть обратные кавычки внутри двойных кавычек, так же как и у строки prog=... вверху.

Во-вторых, если $prog является многострочной строкой (например, dpkg -l), вы не можете реально сравнить имя файла со всем списком. Вместо этого вам нужно сравнивать один элемент за раз с именем файла.

Вот пример использования dpkg и /usr/bin

#!/bin/bash
progs="`dpkg -l | awk '{print $2}'`"

for file in /usr/bin/*
do
    base=`basename ${file}`

    for prog in ${progs}
    do
        if [ "${base}" = "${prog}" ]; then
            echo "${file}" matches "${prog}"
        fi
    done
done
0 голосов
/ 30 августа 2010

вы можете использовать case/esac

case "$file" in
  "$prog" ) echo "same";;
esac
...