Shell Script \, exibe lista de diretórios para a opção input / tentando selecionar dois arquivos para comparar

0

Estou tentando fazer com que o usuário selecione dois arquivos de uma lista numerada, que é derivada de uma listagem de diretórios e, eventualmente, será transformada em uma variável. Isso é provavelmente algo simples e estúpido que estou fazendo errado, sou apenas um engenheiro de redes burro tentando automatizar a combinação de alguns comandos de saída de um switch.

Isto é o que eu tenho que não está funcionando:

echo "Please Select the Show interface status file"
select FILE1 in *;
echo "Please Select the Show Vlan file"
select FILE2 in *;

do

Quando eu puder selecionar arquivos do diretório, planejo "cat $ FILE1 > file1" & "cat $ FILE2 > file2", então vou combiná-los.

    
por dis0wned 21.09.2018 / 19:46

2 respostas

2

Cada declaração select precisa ser completada antes de passar para a próxima. Uma instrução select é, na verdade, um tipo especial de loop.

Digamos que eu tenha um conjunto de arquivos, examplefile01 a examplefile10 . Se eu tivesse um roteiro como este:

select f in example*; do
  echo "You selected $f"
  break
done

Ficaria assim em execução:

$ ./470595.sh
1) examplefile01    4) examplefile04   7) examplefile07  10) examplefile10
2) examplefile02    5) examplefile05   8) examplefile08
3) examplefile03    6) examplefile06   9) examplefile09
#? 5
You selected examplefile05

A declaração break é importante, porque senão a instrução select retornaria para apresentar as opções novamente.

Então, no seu caso, você pode querer algo como:

echo "Please Select the Show interface status file"
select FILE1 in *; do
    cat "$FILE1" >> outputfile1
    break
done

echo "Please Select the Show Vlan file"
select FILE2 in *; do
    cat "$FILE2" >> outputfile2
    break
done

Você também pode ficar um pouco esperto e evitar as instruções echo , modificando o prompt fornecido pela instrução select definindo PS3:

PS3="Please Select the Show interface status file )"
select FILE1 in *; do
    cat "$FILE1" >> outputfile1
    break
done

PS3="Please Select the Show Vlan file )"
select FILE2 in *; do
    cat "$FILE2" >> outputfile2
    break
done

Além disso, como você planeja combinar os arquivos, talvez seja mais fácil fazer isso ao mesmo tempo que a seleção final:

PS3="Please Select the Show interface status file )"
select FILE1 in *; do
    break
done

PS3="Please Select the Show Vlan file )"
select FILE2 in *; do
    cat "$FILE1" "$FILE2" > outputfile
    break
done
    
por 21.09.2018 / 20:01
0

Obrigado pela ajuda, consegui que funcionasse. Não é bonito, mas faz o que eu quero

#Combine Show Vlan and Show interface status Function
combinevlanshint()
{
cd $shintstatvlan
clear
#Ask for Hostname 
echo "Names can not contain spaces:"
echo " "
echo "Please enter the Hostname"
read "hostname" 
clear
echo "Please Select the Show interface status file"
select FILE1 in *; do
    cat "$FILE1" > $shintstatvlan/file1
    break
done
echo "Please Select the Show Vlan file"
select FILE2 in *; do
    cat "$FILE2" > $shintstatvlan/file2
    break
    done

echo "You picked $FILE1 and $FILE2 , These files will now be combined. Press any key to continue"
read -n 1



     cat $FILE1 > file1
     cat $FILE2 > file2
sed 's/[[:space:]]*,[[:space:]]*/,/g' file1 > file1.$$ && awk -F, 'FNR==NR{f2[$1]=$2;next} FNR==1{print $0, "VLAN Name";next} {print $0,($5 in f2)?f2[$5]:"NA"}' OFS=, file2 file1.$$ > file3 && rm file1.$$
mv file3 
mv --backup=t $shintstatvlan/file3 $outputdir/$hostname.shintstatwvlans.txt
rm $shintstatvlan/file1 $shintstatvlan/file2
break
clear
mainmenu
}
    
por 21.09.2018 / 20:56