Domanda

Questa domanda è basata su questo filo.

Il codice

function man()
{       
    man "$1" > /tmp/manual; less /tmp/manual 
}

Problema: se utilizzo anche una sola opzione, il comando non sa dove si trova il manuale desiderato

Ad esempio,

man -k find

mi dà un errore, poiché il riferimento è sbagliato.Il comando recita -k come il manuale.

Il mio tentativo di risolvere il problema in pseudo-codice

if no parameters
    run the initial code
if one parameter
    run: man "$2"
...

In altre parole, dobbiamo aggiungere un controllo delle opzioni all'inizio in modo tale che

Pseudo-codice

    man $optional-option(s) "$n" > /tmp/manual; less /tmp/manual

dove $n

  • n=1 se zero opzioni
  • n=2 se 1 opzione
  • n=3 se 2 opzioni
  • ....

Come puoi effettuare un tale "controllo delle opzioni" da poter modificare il valore di $n?

Problema sviluppato: per creare due cicli if per le situazioni da n=1 a n=2

È stato utile?

Soluzione

Che ne dite di passare tutti gli argomenti

function man()
{       
    man $@ > /tmp/manual; less /tmp/manual 
}

Qual è il bug in meno che si parla nel titolo?

Altri suggerimenti

Innanzitutto, puoi passare tutti gli argomenti della tua funzione a man usando $* O $@.Puoi leggere man sh per i dettagli precisi sulla differenza tra i due;il racconto è da usare quasi sempre "$@" con virgolette doppie.

In secondo luogo, il file temporaneo non è necessario.Potresti renderlo un po' più pulito collegando l'output di man direttamente a less:

function man() {
    man "$@" | less
}

A proposito, se stai semplicemente cercando di utilizzare un cercapersone diverso (man usi more e tu vuoi il più elaborato less) ce n'è uno comunemente riconosciuto PAGER variabile di ambiente che è possibile impostare per sovrascrivere il cercapersone predefinito.Potresti aggiungere questo al tuo ~/.bashrc ad esempio per dire a tutti i programmi di utilizzare less quando si visualizzano più schermate di output:

export PAGER=less

Per rispondere alla tua domanda precisa, puoi controllare il numero di argomenti con $#:

if [ $# -eq 0 ]; then
    : # No arguments
elif [ $# -eq 1 ]; then
    : # One argument
# etc.

Potresti anche trovare il shift comando utile.Si rinomina $2 A $1, $3 A $2, e così via.Viene spesso utilizzato in un ciclo per elaborare gli argomenti della riga di comando uno per uno:

while [ $# -gt 1 ]; do
    echo "Next argument is: $1"
    shift
done

echo "Last argument is: $1"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top