Vraag Bashing Script in een script


Ik heb een klein script geschreven waarmee ik twee verschillende servers via SSHFS kan verbinden. Het script stelt de variabelen in of zet standaard waarden in als er niets wordt ingevoerd, d.w.z. SSH-poort 22.

Ik wil een script maken waarmee ik 1, 2 of 3 kan typen en verbinding kan maken

  1. SSHFS-script waarin ik variabelen invoerde
  2. SSHFS-server 1
  3. SSHFS-server 2

Met als hoofddoel dat ik niet elke keer een gebruikersnaam, wachtwoord, servernaam, enz. Moet typen, telkens wanneer ik verbinding maak via Via SSHFS.

Wat is de beste manier om dit te structureren, zodat ik mijn SSHFS-regel niet hoef te herhalen

De variabelen voeden deze regel.

sshfs -o allow_other,defer_permissions -o volname=$USER@$SERVERNAME $USER@$SERVERNAME:$REMOTEMOUNT $LOCALMOUNT -p$PORTNUMBER

Als ik switch-case gebruik, moet ik dit in elke switch-case opnemen of is er een manier om het te structureren, zodat deze regel maar één keer wordt opgenomen.


1
2018-01-13 17:03


oorsprong


Het is moeilijk om te zeggen zonder de scripts te zien, maar het is misschien het gemakkelijkst om alles in één script te zetten. Definieer bijvoorbeeld enkele functies en vervolgens een case-opdracht die bepaalt welke functie moet worden uitgevoerd. Als elke functie hetzelfde zou doen met alleen maar verschillende argumenten, definieer dan één functie en voer verschillende opties in afhankelijk van de case-instructie. - wjandrea


antwoorden:


Gebruik het eerst niet $USER. Dat is een standaard omgevingsvariabele die de gebruikersnaam van de huidige gebruiker bevat. Als de gebruikersnaam hetzelfde is in alle servers en op de computer waarop u het script uitvoert, dan is dat goed. Maar als dat niet het geval is, gebruik dan een andere naam. Gebruik in het algemeen geen UPPER CASE-variabelenamen in bash omdat de standaard gereserveerde allemaal hoofdletters zijn.

Dat gezegd hebbende, zou je zoiets als dit kunnen doen:

#!/bin/sh
case $1 in
    1)
        user="user1"
        servername="server1"
        remotemount="remote1"
        localmount="local1"
        portnumber="port1"
        ;;
    2)
        user="user2"
        servername="server2"
        remotemount="remote2"
        localmount="local2"
        portnumber="port2"
        ;;
    3)
        user="user3"
        servername="server3"
        remotemount="remote3"
        localmount="local3"
        portnumber="port3"
        ;;
    *)
        echo "Please use 1, 2 or 3"
        exit 1
        ;;
esac

echo sshfs -o allow_other,defer_permissions -o volname=$user@$servername $user@$servername:$remotemount $localmount -p$portnumber

Vervolgens voer je het geven van je script uit 1, 2 of 3 als een parameter:

foo.sh 2

2
2018-01-13 22:11



@wjandrea bedankt voor de oplossing, ik had dat gemist. En bedankt dat je me hebt geleid om erachter te komen dat de finale ;; in een case-statement is, blijkbaar, optioneel! Ik had dezelfde weglating in mijn testscript en het werkte zoals verwacht. Ik had geen idee! - terdon♦
Huh. Hoe bizar ... - wjandrea
Bedankt, ik wist niet dat je het script kon uitvoeren met jouw selectie, wat geweldig is. bespaart op het aanvragen van het binnen het script. - denski
Waarom moet je afsluiten met '1'? - denski
@denski doe je niet nodig hebben het is gewoon een conventie. Normaal gesproken wordt bij een succesvolle voltooiing een programma afgesloten met een 0 exit code. Een niet-0-exitcode betekent dat er een fout is opgetreden. Dus, omdat het geven van een slechte invoerparameter een fout is, verlaat ik met 1. En ja, er is zeer, zeer zelden een goede reden om de invoer van het scriptverzoek na de lancering te hebben. In 99% van de gevallen is het beter om de info door te geven aan het script wanneer je het start. - terdon♦