Puncte:0

Cum reatribuiți un argument pozițional astfel încât să fie disponibil în afara funcției?

drapel us

Încerc să creez o funcție string_split compatibilă cu #!/bin/sh, care are o sintaxă de comandă similară cu comanda de citire, astfel încât să puteți trece șirul pe care doriți să îl împărțiți și variabilele pe care doriți să le atribuiți șirurile.

Aceasta este funcția cu care am venit, dar nu îmi pot da seama cum să fac noile valori disponibile în afara funcției, așa cum poate face comanda citire.

#!/bin/sh
split_str() {
    input_original=$1
    intrare=$1
    input_delimiter=2$

    input=$(echo "$input" | sed -e "s/$input_delimiter/ /g")
    set -- "$input_original" "$input_delimiter" $input
}

Utilizarea dorită a comenzii ar arăta astfel:

split_str „Bună lume” „ „ cuvânt1 cuvânt2
ecou „$cuvânt1”
# Ieșire: Bună
ecou „$cuvânt2”
# Ieșire: Lumea

Soluţie

Folosind răspunsul bac0ns de mai jos, am reușit să obțin această soluție care funcționează cu orice număr de parametri de ieșire trecuți. Multumesc pentru ajutor @bac0n

#!/bin/sh
split_str() {
    intrare=$1
    input_delimiter=2$
    
    # Izolați parametrii de ieșire
    output_params=$(echo "${@}" | sed -e "s/$input $input_delimiter//g")

    # Adăugați un argument variabil suplimentar pentru a prinde orice depășire.
    # Acest lucru împiedică adăugarea oricăror părți suplimentare ale șirului secundar la
    # parametri trecuți. 
    output_params="$output_params depășire"

    # Împărțiți șirul citind valorile cu read
    IFS="$input_delimiter" citește -r $output_params << EOF
$1
EOF
}
kevincorrigan avatar
drapel us
@Terrance Poți extinde asta? Dacă adaug return $input la funcția mea, primesc o eroare. "argument numeric necesar"
Terrance avatar
drapel id
Îmi pare rău pentru asta, folosesc asta pentru a returna 0 sau 1 când îmi apelez funcțiile dacă sunt adevărate sau false.
bac0n avatar
drapel cn
este /bin/sh (liniuță) o cerință?
kevincorrigan avatar
drapel us
@bac0n Da /bin/sh este necesar.
Puncte:2
drapel cn

Funcțiile rulează în același context ca shell-ul actual, este perfect de setat cuvânt 1 și cuvântul2 în interiorul funcției și folosiți-le din domeniul de apelare:

Despică(){
    local a=$1 b=$2
    tura 2
    IFS=$b citire -r $@ _ << \
EOF
    $a
EOF
}

împărțiți „bună lume” „ „ cuvânt1 cuvânt2

printf %s\n "1:$cuvânt1" "2:$cuvânt2"
kevincorrigan avatar
drapel us
Mulțumesc! Nu era exact ceea ce aveam nevoie, dar m-a îndreptat în direcția corectă. Îmi voi actualiza întrebarea cu noua mea funcție.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.