Cum pot seta o variabilă de ieșire de comandă în Bash?

Am o destul de simplu script care este ceva de genul următor:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

Atunci când am rula acest script de linie de comandă și se trece la argumente, nu primesc nici o ieșire. Cu toate acestea, atunci când am rula comenzile conținute în $MOREF variabil, eu sunt în măsură pentru a obține de ieșire.

Cum se poate lua rezultatele de o comanda, care trebuie să fi rulat într-un script, salvați-l pentru o variabilă, și apoi de ieșire variabila pe ecran?

Comentarii la întrebare (4)
Soluția

În plus față de backticks `comanda` puteți folosi $(comandă) sau"$(comandă)" care mi se pare mai ușor de citit, și permite pentru cuibărit.

OUTPUT="$(ls -1)"
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

Citându-l (") contează pentru a păstra multi-linie de valori.

Comentarii (14)

Modul corect este de

$(sudo run command)

Daca're de gând să utilizeze un apostrof, ai nevoie de `, nu'`. Acest personaj este numit "backticks" (sau "accent grav").

Astfel:

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"
Comentarii (4)

Astfel cum a indicat deja pentru tine, ar trebui să utilizați 'backticks'.

Alternativa propusă de $(comandă) funcționează la fel de bine, și, de asemenea, mai ușor de citit, dar rețineți că aceasta este valabil numai cu Bash sau KornShell (și scoici derivate din acestea), deci, dacă script-uri trebuie să fie cu adevărat portabile pe diverse sisteme Unix, ar trebui să prefera vechi backticks notație.

Comentarii (7)

Unele [tag:bash] trucuri folosesc pentru a seta variabilele de comenzi

Al 2-lea Edit 2018-02-12: Adăugarea unui alt drum, de căutare în partea de jos de acest lucru pentru timp-sarcini de funcționare!

2018-01-25 Edit: adăugați funcție de probă (pentru popularea vars despre utilizarea discului)

În primul rând simplu vechi și compatibil cu

myPi=`echo '4*a(1)' | bc -l`
echo $myPi 
3.14159265358979323844

Cea mai mare parte compatibile, al doilea mod

Ca de cuibărit ar putea deveni grele, paranteză a fost implementat pentru asta


myPi=$(bc -l 
Comentarii (3)

Cunosc trei moduri de a face:

1) Funcțiile sunt potrivite pentru astfel de sarcini:

func (){
ls -l
}

Invoca prin a spune func

2) de Asemenea, o altă soluție potrivită ar putea fi eval:

var="ls -l"
eval $var

3) A treia este utilizarea de variabile direct:

var=$(ls -l)
OR
var=`ls -l`

puteți obține de ieșire a treia soluție în sensul bun:

echo "$var"

și, de asemenea, în mod rautacios:

echo $var
Comentarii (3)

Doar pentru a fi diferit:

MOREF=$(sudo run command against $VAR1 | grep name | cut -c7-)
Comentarii (0)

Când setarea unei variabile asigurați-vă că aveți FĂRĂ Spații înainte și/sau după = semn. Literalmente petrecut o oră în încercarea de a seama de acest lucru, încearcă tot felul de soluții! Acest lucru Nu este cool.

Corect:

WTFF=`echo "stuff"`
echo "Example: $WTFF"

Nu va Reuși cu eroare: (lucruri: nu a fost găsit sau similar)

WTFF= `echo "stuff"`
echo "Example: $WTFF"
Comentarii (1)

Dacă vrei să o faci cu multilinie/comandă multiplă/s, atunci puteți face acest lucru:


output=$( bash 
Comentarii (16)

Aveți nevoie pentru a utiliza fie

$(comanda aici)

sau

`command-here`

exemplu

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"

echo "$MOREF"
Comentarii (2)

Puteți folosi back-căpușe(de asemenea, cunoscut sub numele de accent morminte) sau $(). Cum ar fi ca-

OUTPUT=$(x+2);
OUTPUT=`x+2`;

Ambele au același efect. Dar de IEȘIRE=$(x+2) este mai ușor de citit și cel mai recent.

Comentarii (2)

Acesta este un alt mod, bun pentru a utiliza cu unele editoare de text, care sunt în imposibilitatea de a evidenția în mod corect fiecare complicate de cod pe care le creați.


read -r -d '' str < 
Comentarii (2)

Unii ar putea găsi acest util. Valori variabile de substituție, în cazul în care truc este folosirea $(()) duble paranteze:

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done
Comentarii (5)

Aici sunt două mai multe moduri:

Vă rugăm să păstrați în minte că spațiul este foarte important în [tag:bash]. Deci, dacă doriți dvs. de comandă pentru a rula, utiliza ca atare fără a introduce mai multe spații.

  1. următoarele atribuie harshil să-L și apoi imprimă

L=$"harshil" echo "$L"

  1. următoarele atribuie datele de ieșire ale comenzii tr să L2. tr este operat pe o altă variabilă L1.

L2=$(echo "$L1" | tr [:upper:] [:inferioară:])

Comentarii (2)

Dacă comanda pe care încerci să execute eșuează, se va scrie rezultatul pe stream-ul de eroare și ar fi apoi imprimate la consola. Pentru a evita aceasta, trebuie să redirecționeze eroare stream

result=$(ls -l something_that_does_not_exist 2>&1)
Comentarii (0)