2015-04-20 3 views
1

У меня есть две переменные, оба представляют собой список имен файлов, которые были перемещены скриптом.Bash: проверить, существует ли переменная в пределах другой переменной?

Переменная 1: Сгенерировано контуром «чтения» большей переменной. В любой момент он содержит только одно имя файла.

var1 = pic1.jpg

var1 = pic2 duplicate.jpg

var1 = pic3 (DUP) .jpg

var1 = pic4.jpg

var1 = подкаталог/в подпапке picture.png

Как показано выше, имена файлов могут содержат пробелы, но не всегда.

Variable 2: Строка, содержащая список файлов, каждое имя файла разделяется символом новой строки \n.

var2 = pic1.jpg \n pic2 duplicate.jpg \n pic3 (DUP) .jpg \n pic4.jpg

Я пытаюсь проверить, если содержимое var1 можно найти в var2:

listcontains() { 
     for list_item in $1; do 
      # Does $list_item exist in $2? 
      if [[ "$list_item" =~ "$2" ]]; then 
       return 0 
      else 
       return "1" 
      fi 
     done 

    } 

    # Call function to see if var1 is in var2 
    if listcontains "$var1" "$var2" 
     then 
      # var1 is in var2; do stuff... 
     else 
      # Do different stuff... 
    fi 

Эта логика явно не так, или синтаксис является неправильным, так как он всегда возвращает не MATC ч на данный момент:

does pic2 exist in pic2 duplicate.jpg 
pic2.jpg 
pic3(dup).jpg 
pic3.jpg? 
no 

does pic3(dup).jpg exist in pic2 duplicate.jpg 
pic2.jpg 
pic3(dup).jpg 
pic3.jpg? 
no 

Я все еще учусь Баш, так что если кто-нибудь может мне помочь, то это было бы массово оценили.

ответ

1

Правая сторона =~ является шаблоном регулярного выражения. Левая сторона - это строка, в которой она соответствует.

У вас есть аргументы назад. Вы также не учитываете никаких специальных символов регулярных выражений в $list_item, которые будут сбрасывать ваши матчи.

Впишите ли ваши $list_item записи в виде файлов или полных имен файлов? Если они являются полными именами файлов, тогда было бы проще использовать цикл read и делать точные совпадения с каждой строкой в ​​$var2 вместо этого (даже лучше было бы использовать ассоциативный массив имен файлов в $var2, чтобы сделать сопоставление намного быстрее).

Это утверждение, использующее строку для имен файлов, является плохой идеей, потому что она делает что-либо с ними (особенно если они могут иметь пробелы/и т. Д.) Трудно невозможным.

+0

Вы верны!Я переключил аргументы на стороне теста и зафиксировал его на ожидаемом выходе. Элементы являются полными именами файлов. –

0

Здесь я покажу вам, как это работает в консоли, затем вы можете скопировать код в файл сценария bash.

[email protected] ~ 
$ for ele in "${var1[@]}"; do echo $ele; done 
abc 
def 

[email protected] ~ 
$ echo "$var2" 
abc 
ghi 

[email protected] ~ 
$ IFS=$'\n' read -rd '' -a array <<< "$var2" 

[email protected] ~ 
$ for ele in "${array[@]}"; do echo $ele; done 
abc 
ghi 

[email protected] ~ 
$ for ele in "${var1[@]}"; \ 
> do 
> if [[ ${array[*]} =~ $ele ]] 
> then 
> echo "var2 contains $ele" 
> else 
> echo "var2 does not contain $ele" 
> fi 
> done 
var2 contains abc 
var2 does not contain def 
Смежные вопросы