Bash "-e" puzzelspel

Ik probeer een opdrachtreeks te maken op basis van een "-e" -markering en een andere variabele in een ander basisscript dat wordt aangeroepen als een subroutine en een vreemd probleem is tegengekomen; Ik verlies het "-E" -gedeelte van de string als ik deze doorgeef in de subroutine. Ik maak een paar voorbeelden die het probleem illustreren, welke hulp dan ook?

Dit werkt zoals je zou verwachten:

$echo "-e  $HOSTNAME"

-e  ops-wfm

Dit doet niet; we verliezen de "-e" omdat het wordt geïnterpreteerd als een speciale kwalificatie.

$myFlag="-e $HOSTNAME"; echo $myFlag

ops-wfm

Het toevoegen van de "\" escape charactor werkt ook niet, ik krijg de juiste string met de "\" ervoor:

$myFlag="\-e $HOSTNAME"; echo $myFlag

\-e ops-wfm

Hoe kan ik voorkomen dat -e wordt ingeslikt?

4

2 antwoord

Gebruik dubbele aanhalingstekens:

$ myFlag="-e $HOSTNAME"; echo "${myFlag}"
-e myhost.local

Ik gebruik $ {var} in plaats van $ var uit gewoonte, omdat dit betekent dat ik tekens achter de variabele kan toevoegen zonder dat de shell ze als onderdeel van de naam van de variabele interpreteert.

echo may not be the best example here. Most Unix commands will accept -- to mark no more switches.

$ var='-e .bashrc' ; ls -l -- "${var}"
ls: -e .bashrc: No such file or directory
4
toegevoegd
Ik heb mijn antwoord bijgewerkt.
toegevoegd de auteur Johnsyweb, de bron
@chesnutp, zonder de echte code te kunnen zien, waarschijnlijk is wat er gebeurt dat zonder de aanhalingstekens, uw variabele onderhevig is aan woordsplitsing, zodat het programma de woorden "-e" en "waarde" zal ontvangen, en met dubbele aanhalingstekens, de programma ontving het enkele woord "-e waarde".
toegevoegd de auteur glenn jackman, de bron
thx voor de tip; Ik test in het bash-script. Wat doet {} voor de functie?
toegevoegd de auteur chesnutp, de bron
Johnsyweb, je gedetailleerde antwoord gaf me de leiding die ik moest oplossen, bedankt. Blijkt dat het echo-artefact een rode haring was en niet het echte probleem. In de oorspronkelijke aanroep gebruikte ik "$ myFlag" waardoor de sub een foutmelding kreeg "optie vereist een argument - e". Ik heb bijgewerkt om de indeling {} te gebruiken (mijn "$ myFlag" is gewijzigd in $ {myFlag}) en bingo werkte. Weet niet zeker waarom het eerste formaat een fout veroorzaakt in de verplichte OPTARG-vereiste. Bedankt pc
toegevoegd de auteur chesnutp, de bron

Nou, je zou je variabele tussen aanhalingstekens kunnen zetten:

echo "$myFlag"

... waardoor het gelijk is aan je eerste voorbeeld, wat, zoals je zegt, prima werkt.

3
toegevoegd