Bash - jak rozwinąć zmienną przy użyciu przełączników wielkości liter

4

Ucząc się bash, zastanawiałem się, czy jest to możliwe, z przypadkiem, czy z jakąś funkcją.

Na przykład..

./test.sh arg1 -p help,contact -e html,php # don't know how to expand them both

LUB czy można zrobić coś takiego?

./test.sh arg1 -p help -p contact -e html -e php
or 
./test.sh arg1 -p help -e html -p contact -e php

Chcę, aby wynik był jak ...

Adres URL to www.google.com/help.html

Adres URL to www.google.com/contact.php

kod:

var1=$1
url="http://www.google.com/"

# maybe use a for loop here??

# Okay now if I use getopts - @Hannu

while getopts ":p:e:" o; do
case "${o}" in
        p)
        page+=("$OPTARG")
        ;;
        e)
        extension+=("$OPTARG")
        ;;
esac
done
shift $((OPTIND -1))

#I need a better for loop here - which can expand both variables

for val in "${extension[@]}"; # 
do

# FAIL - pass first switch arguments -p and -e to for loop

echo "URL is http://www.google.com/$page.$val
done

WYJŚCIE: # najbliżej mogę dostać się do argumentu first -p

./test.sh -p help -p contact -e html -e php

Adres URL to http://www.google.com/help.html

Adres URL to http://www.google.com/help.php

Lewis Wheeler
źródło
3
$ man getopt# jedna droga
Hannu
Czy możesz teraz sprawdzić kod? Byłem tak blisko, ale mogę rozwinąć tylko jeden z pętlą for
Lewis Wheeler
Iterujesz tylko po extensiontablicy, ale nie po pagetablicy. Czy chcesz łączyć nazwy stron i rozszerzenia jeden do jednego lub jeden do wszystkich? Jeśli po pierwsze - potrzebujesz for (())pętli ze zmienną indeksu, aby iterować po obu tablicach. Jeśli drugi - potrzebujesz dwóch zagnieżdżonych pętli
andrybak
Chcę połączyć jeden do jednego (najpierw -p z pierwszym -e). To byłoby help.html i help.php, a następnie contact.html i contact.php. Czy możesz pokazać, w jaki sposób zrobiono for (()) dla mojego skryptu? Patrzę na kilka przykładów „dla pętli ze zmienną indeksu”, zaktualizuję post, jeśli sprawię, że zadziała. Dzięki
Lewis Wheeler,

Odpowiedzi:

1

ok, następujące wydają się działać. Dzięki @tso

https://stackoverflow.com/questions/44067504/bash-iterate-multiple-variable-with-for-loop-index

#!/bin/bash
var1=$1
url="http://www.google.com/"

# maybe use a for loop here??

# Okay now if I use getopts - @Hannu

while getopts ":p:e:" o; do
case "${o}" in
        p)
        page+=("$OPTARG")
        ;;
        e)
        extension+=("$OPTARG")
        ;;
esac
done
shift $((OPTIND -1))


for ((i=0;i<${#extension[@]};++i));
do
echo "URL is www.google.com/${page[i]}.${extension[i]}"
done
Lewis Wheeler
źródło
O tym powinieneś być w stanie ustawić to jako odpowiedź na swoje własne pytanie, i dzięki temu zyskać trochę statusu ... :-)
Hannu