2011-04-14 4 views
1

У меня есть две переменные $ а и $ ЬСравнение двух переменных в оболочке

и

$a=Source/dir1/dir11 
$b=Destination/dir1/dir11 

$ а и $ Ь изменения, но инициалы источника/назначения и/остается тем же.
Я хочу сравнить $ а и $ Ь без источника/назначения и/

, как я должен это делать? После кода я использую

SOURCE_DIR_LIST=`find Source/ -type d` 
    DEST_DIR_LIST=`find Destination/ -type d` 

for dir_s in $SOURCE_DIR_LIST 
do 
    for dir_d in $DEST_DIR_LIST 
    do 

     if [ ${dir_s/Source\//''} == ${dir_d/Destination\//''} ] 
     then 
       echo " path match = ${dir_s/Source\//''}" 

     else 
      echo "path does not match source path = ${dir_s/Source\//''} " 
      echo " and destination path= ${dir_d/Destination\//''} " 
     fi 
    done 
done 

Но выход приходит вроде как следовать

path match = '' 
./compare.sh: line 9: [: ==: unary operator expected 
path does not match source path = '' 
and destination path= ''dir2 
./compare.sh: line 9: [: ==: unary operator expected 
more 
+1

FYI Вы фактически не назначаете ничего в этом выражении. Потеряйте знаки доллара, чтобы выполнять задания. –

+2

Исправлены ли имена «Источник» и «Целевое назначение», или это пути, удерживаемые в переменных? Это может повлиять на лучший ответ. –

+0

Я хочу компаре, даже если он изменяется, как $ a = Source/dir1/dir11/mydir. Я всегда хочу сравнить без Source/и Destination/ – Vivek

ответ

4
if [ ${a/Source/''} == ${b/Destination/''} ] 
then 
    # do your job 
fi 
+0

не сравнивается, если $ a = Source/dir1/dir11/mydir. Я всегда хочу сравнивать без Source/and Destination/ – Vivek

+0

, чтобы изменить это, если [$ {a/Source \ // ''} == $ {b/Destination \ // ''}] – Neo

+0

@Hellboy: это не будет работать слишком хорошо для вас, когда вы не понимаете оболочку достаточно хорошо, чтобы распознать правильный ответ. Я предлагаю вам найти и проработать пару базовых учебников по сценариям. –

1
if [ `echo $a | sed 's/Source\///'` == `echo $b | sed 's/Destination\///'` ] 
then 
    # Do something 
fi 
+0

Лучше использовать '' $ (...) '', чем обратные сигналы. Кроме того, у bash есть оператор '' <<< ', чтобы избежать этого. –

0

или с AWK

#!/bin/bash 
    a="Source/dir1/dir11" 
    b="Destination/dir1/dir11" 
    SAVEIFS=$IFS 
    IFS="\/" 
    basea=$(echo $a | awk '{print $1}') 
    baseb=$(echo $b | awk '{print $1}') 
    if [ $basea == $baseb ]; then 
     echo "Equal strings" 
    fi 
    IFS=$SAVEIFS 
+0

Вы можете использовать '' <<< '', чтобы избежать' echo' awk'. Кроме того, 'basea' будет содержать Source и' baseb' будет содержать Destination; вам нужно распечатать все, кроме '$ 1'. И становится проблематичным, если Source на самом деле '/ mnt/usb-stick/installation/path', а Destination на самом деле'/opt/SomeBody/Program'. Я не уверен, почему у вас есть обратная косая черта в IFS. –

1

использованием case/esac

case "${a#*/}" in 
${b#*/}) echo "ok";; 
esac 
Смежные вопросы