Domanda

Sto cercando di creare un semplice for Loop che prenderà tutte le uscite di un ls comanda e metti ogni output in una variabile. Finora l'ho fatto

for i in ls /home/svn
do
    echo $i
done

Ma mi dà un errore.

È stato utile?

Soluzione

Perché il ls deve essere eseguito:

for i in $(ls ...); do
  echo $i
done

Inoltre, potresti voler considerare invece Shell Globbing:

for i in /home/svn/*; do
  echo $i
done

... o find, che consente una selezione a grana molto fine delle proprietà degli articoli da trovare:

for i in $(find /home/svn -type f); do
  echo $i
done

Inoltre, se puoi avere spazio bianco nei segmenti del percorso o dei nomi di file, usa un ciclo while (esempio precedente regolato):

find /home/svn -type f|while read i; do
  echo $i
done

while legge in termini di linea, in modo che lo spazio bianco sia preservato.

Riguardo alla chiamata di basename Hai due opzioni:

# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}

Per spiegare la sostituzione: ## Rimuove il modello anteriore più lungo dalla corda, # Fino alla prima partita di pattern, %% il modello più lungo ancorato e % La prima partita completa con il back-ancorato.

Altri suggerimenti

Non hai bisogno di usare ls Per ripassare i file in questo caso, quanto segue farà il lavoro: for i in /home/svn/*; do echo $i; done

Vuoi assegnare l'output del comando LS a I, quindi devi racchiuderlo nei backtick o nell'operatore $ ():

for i in $(ls /home/svn)
do
    echo $i
done

Questo perché stai sbagliando in primo luogo.

for i in /home/svn/*
do
  echo "$i"
done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top