• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

printf - array

catweasel

Hacker
Code:
array=( a b )
while read ${array[@]}; do
	printf "%s %s\n" $(eval echo $(echo ${array[@]} | sed 's/^/$/' | sed 's/ / $/g'))
done <datei

gibt es dafür eine einfachere Schreibweise?
Ich möchte nicht
printf "%s %s\n" $a $b
schreiben, sondern
printf "%s %s\n" ${array[@]}
.
 

regexer

Advanced Hacker
catweasel schrieb:
printf "%s %s\n" ${array[@]}
Das funktioniert doch! Zumindest solange in den einzelnen Array-Werten keine spaces vorkommen.

Allerdings habe ich vermutlich nicht ganz verstanden, was du willst. Willst du den Inhalt von array wiederum als Variablennamen evaluieren?

Eventuell wäre es besser, ein bisschen mehr aus dem script zu posten und zu erklären, was das Teil eigentlich machen soll.
 

regexer

Advanced Hacker
Ich habe nochmals drüber nachgedacht. Wäre das vielleicht passend?
Code:
array=( a b ) 
while read ${array[@]}; do 
  for varname in ${array[@]}
  do
    printf "%s " $(eval \$$varname)
  done
  printf "\n"
done <datei

Aber dein Wunsch, dass printf "%s %s\n" ${array[@]} das Array automatisch als Array mit Variablen-Namen ansieht ist wohl nicht möglich. Das würde ja der Logik der Shell-Evaluierung widersprechen.
 
OP
C

catweasel

Hacker
notoxp schrieb:
Willst du den Inhalt von array wiederum als Variablennamen evaluieren?
Ja.

Das Skript sollte zum Einlesen von Spalten dienen; der printf-Teil sollte mir anzeigen, was ich eingegeben habe. Dabei möchte ich das Skript bei verschiedenen Einsätzen so wenig wie möglich edieren, z.B nur die "array=( a b c )"-Zeile, wobei mir das Skript von notoxp einen Schritt weiterhilft, weil sich dort auch die Anzahl der %s automatisch richtet (mit dem Nachteil, dass alle Spalten gleich breit bleiben).
Das Skript musste ich aber etwas ändern, damit es bei mir ohne Fehlermeldung (./script: line 7: peter: command not found) läuft:

Code:
#!/bin/bash
 
array=( a b c ) 
 while read ${array[@]}; do 
   for varname in ${array[@]} 
   do 
     eval printf "%s\ " \$$varname 
   done 
   printf "\n" 
 done <datei
 
Oben