2013-05-08 2 views
1

Я прочитал содержимое папки и сохранил их в массиве. И нужно передать этот массив скрипту. Как я могу хранить и передавать массив и читать этот массив?Сравнение 2 массивов в скрипте оболочки

#!/usr/bin/ksh 

cd /path/applications-war 
arrayWar=($(ls /path/applications-war)) 

Мне нужно все содержимое под этой папкой в ​​массив (@arrayWar). Я войду в другую коробку и вызову скрипт. Мне нужно передать этот массив в скрипт.

/usr/bin/ssh -t -t [email protected] /path/myscript.sh @arrayWar 

Внутри myscript.sh, я хочу, чтобы сравнить переданную @arrayWar массив с ServicesArray.

#!/bin/ksh 
@arrayWar = $1 
ServicesArray=('abc.war' 'xyz.war') 
    for warfile in @arrayWar 
    do 
     if echo "${ServicesArray[@]}" | fgrep "$warfile"; then 
      echo "$warfile matches" 
     else 
      echo "$warfile not matched" 
     fi 
    done 
+0

действительно, ksh с пробелами вокруг вашего '=' знака? Вы не получите сообщение об ошибке? Удачи. – shellter

+0

@fedorqui: Моя проблема не с пробелами. Он должен передавать элементы в массив и сравнивать два массива. – Jill448

+0

Вы не можете передавать массивы в оболочках; вы можете передать содержимое массива только как последовательность позиционных аргументов. – chepner

ответ

2

Вот ваш скрипт, который принимает переменное число файлов в качестве аргументов:

#!/bin/ksh 
ServicesArray=('abc.war' 'xyz.war') 

for warfile in "${@##*/}" 
    do 
    if echo "${ServicesArray[@]}" | fgrep "$warfile"; then 
     echo "$warfile matches" 
    else 
     echo "$warfile not matched" 
    fi 
done 

Вы называете ваш сценарий, как это (обратите внимание, что при использовании ls не рекомендуется):

arrayWar=(/path/applications-war/*) 
/usr/bin/ssh -t -t [email protected] /path/myscript.sh "@{arrayWar[@]}" 

Вы также можете отказаться от arrayWar и передать список файлов напрямую

/usr/bin/ssh -t -t [email protected] /path/myscript.sh /path/applications-war/* 
+0

Если я передам только список файлов напрямую, будет ли у «$ @» список для сравнения? – Jill448

+0

Да. С точки зрения вашего сценария эти два эквивалента. '$ {arrayWar [@]}' и '/ path/applications-war/*' расширяются оболочкой для идентичных списков слов. – chepner

+0

Я пробовал '/ path/applications-war/*'. Но его показ не совпадает, хотя список содержит элементы в ServiceArray. Потому что его перечисление как '\ path \ applyatipns-war \ abc.war' и' \ path \ applications-war \ xyz.war'. И его сравнение с abc.war и xyz.war. Следовательно, все печатает как не согласованное. Как получить только 'abc.war' и' xyz.war', или нам нужно изменить способ, которым мы делаем grep? – Jill448

0

Как указал chepner, вы не можете передать массив, но есть несколько способов обойти это. Первым было бы передать их как ряд позиционных аргументов, я считаю, что ограничение на них равно 9. Если у вас более 9 элементов в этом массиве или вы хотели бы сделать это более постоянным образом, вы могли бы также довольно легко написать это в BASH (я не знаком с ksh, я сделал быстрый Google, и синтаксис кажется довольно похожим). Я буду использовать вывод ls в этом примере

\#!/bin/bash 


\# Lets say this gives it 'myFile' and 'testFile' 
ls > myArrayFile 

\# Need to change IFS to accurately split the list, this splits by newline 
IFS=$’\x0a’ 

\# Set your array 
compareArray=('myFile' 'testFile' 'someOtherStuff') 

\# Standard loop to compare arrays 

for genItem in `cat myArrayFile`; 
do 
    for staticItem in $compareArray; 
    do 
    if $genItem == $staticItem; 
     then 
     echo "$genItem is in the static array" 
    fi 
done 
done 
Смежные вопросы