Passar um argumento com vários sinalizadores de letra

1

A minha pergunta é sobre um script que me pediram para escrever para a faculdade, então é H / W, mas estou preso e não descobri uma solução.

Estou tentando obter os argumentos de

./tool.sh -f persons.dat -id <id> 

porque eu quero o para exibir os dados da pessoa.

tool.sh é o meu programa e persons.dat é um arquivo com dados de pessoas que se parecem com isso

3601|Wang|Lin|male|1981-01-02|2010-03-14T19:06:18.373+0000|1.10.108.68|Firefox

id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed

Eu sei que não posso usar getopts beacause id é uma bandeira de duas letras e eu poderia passá-la manualmente, mas me pediram para não tomar a posição em consideração:

./tool.sh -f persons.dat -id <id> 

e:

./tool.sh -id <id> -f persons.dat

deve ser do mesmo uso

Alguma idéia?

    
por Μάριος Τσοκανάς 10.10.2016 / 02:08

2 respostas

1

Se o seu problema estiver limitado a essas duas opções, algo assim:

usage() {
echo "tools.sh -id <id> -f <file>"
echo "note: order of options is not important"

}

if [ $# -ne 4 ]; then
    echo "Wrong number of arguments"
    usage   
    exit 1
fi

if [ "$1" = "-f" -a "$3" = "-id" ]; then
    file="$2"
    id="$4"
elif [ "$1" = "-id" -a "$3" = "-f" ]
then
    file="$4"
    id="$2"
else
    echo "Wrong syntax!"
    usage
    exit 1
fi

Depois, você pode analisar seu arquivo com o awk:

awk -F'|' -v id="$id" '$1==id{printf "ID: "$1"\nUser: "$2" "$3"\nGender: "$4"\nBorn: "$5"\nCreation Date: "$6"\nLocation IP: "$7"\nBrowser used: "$8"\n"}' $file

if [ $? -eq 0 ]
then
    exit 0
else
    echo "Something went \"woopsie!\""
    exit 1
fi

Para melhorar, você também pode verificar se id é um número e que persons.dat é realmente um arquivo em algum lugar em PATH ...

    
por 10.10.2016 / 15:15
0
awk -F\| 'NR==1{
for(j=1;j<=NF;j++)
Arr[j]=$j;
next
}
{
printf("./tool.sh -f file --edit");
for(i=1;i<=NF;i++)
printf("%s %s ",Arr[i],$i)
}
{
printf("\n")
}' persons.dat
    
por 10.10.2016 / 09:48