2017-02-06 7 views
2

Аналогично этому >>In bash, how can I check if a string begins with some value?, но не дублируется.Проверка, начинается ли переменная с другой переменной в bash

У меня есть два массива, и для каждой строки внутри первой я хочу проверить, начинаются ли строки во второй, начиная с первой строки или нет.

array1=("test1","test2","test3"); 
array2=("test1 etc","test1 nanana","test2 zzz","test3 abracadabra"); 

for i in "${!array1[@]}"; do 
    for j in "${!array2[@]}"; do 
    if [[ "${array1[i]}" == "${array2[j]}*" ]]; then 
     echo "array1[$i] and arry2[$j] initial matches!"; 
     fi; 
    done; 
done 

Я попробовал много условий внутри, если, например:

if [[ "${array1[i]}" == "${array2[j]*}" ]] 
if [[ "${array1[i]}" == "${array2[j]}*" ]] 
if [[ "${array1[i]}" = "${array2[j]*}" ]] 
if [[ "${array1[i]}" = "${array2[j]}*" ]] 

Также без кавычек, фигурные скобки, и так далее, все без успеха.

ответ

3

В коде есть некоторые ошибки, в первую очередь объявление массива в bash: если вы не помещаете пробелы, у вас есть только один элемент. Не забудьте всегда печатать переменные перед тем, как попробовать что-либо еще на них. Из Баш документы:

ARRAY = (значение1 значение2 ... valueN)

Каждое значение затем в виде [indexnumber =] строка. Индекс номер не является обязательным. Если он указан, ему присваивается этот индекс; В противном случае индекс назначенного элемента - это номер последнего индекса, который был назначен, плюс один. Этот формат принимается также объявлением . Если номера индексов не указаны, индексирование начинается с нуля.

Для цикла элементов массива:

for element in "${array[@]}" 
do 
    echo "$element" 
done 

Вот фрагмент кода:

array1=(test1 test2 test3); 
array2=(test1 etc "test1 nanana" test2zzz test3 abracadabra); 
for word1 in "${array1[@]}"; do 
    for word2 in "${array2[@]}"; do 
     echo "w1=$word1, w2=$word2" 
     if [[ ${word2} == ${word1}* ]]; then 
      echo "$word1 and $word2 initial matches!"; 
     fi;     
    done;       
done 

После замечанием ОП я понял, что он пытается использовать индексы, для этого вам нужно использовать «$» также для индексов «i» и «j». Вот рабочее решение:

for i in "${!array1[@]}"; do 
    for j in "${!array2[@]}"; do  
     echo "${array1[$i]} ${array2[$j]}" 
     if [[ ${array2[$j]} == ${array1[$i]}* ]]; then 
      echo "$array1[$i] and $array2[$j] initial matches!"; 
     fi; 
    done; 
done 
+0

Мой код длиннее; Я использую «readarray -t array1» для установки массивов с командами, поэтому я объявлял массивы не так, но только здесь, в вопросе - моя ошибка. Кроме того, я использовал «!» в передней части массива, потому что я хотел, чтобы «i» и «j» были индексами. Но ваше решение действительно хорошо работает. Благодарю. – gcpdev

+1

Да, я не понял, что вы пытаетесь использовать индексы, в то время как я думаю, что мое первое решение лучше с bash. Я обновляю ответ, чтобы включить тот, который вы пытались реализовать. –

+0

отлично, только что получил еще одну ошибку в моем коде. Большое спасибо. – gcpdev