Newsgroup: it.comp.os.linux.sys
Titolo: Variabili in bash (2)

Ciao a tutti,
se provo a fare quanto segue:
kdialog --menu "Che file vuoi aprire?" $(cat allfiles.txt | awk -F '.' 
'function bn(p) { n=split(p,a,"/"); return a[n]; } { printf(" %s.%s %s", $1, 
$2, bn($1)); }')
a parte la limitazione sui file il cui nome puï¿œ contenere un solo punto, non 
so come fare in modo che venga lanciato:
kdialog --menu "Che file vuoi aprire?" "/path/File 1.txt" "Desc file 1" 
"/path/File 2.txt" "Desc file 2"
Ovvero: come faccio a fare in modo che ci siano gli spazi giusti al posto 
giusto.
Neanche questo funziona:
kdialog --menu "Che file vuoi aprire?" $(cat 1 | awk -F '.' 'function bn(p) 
{ n=split(p,a,"/"); return a[n]; }; function es(p) { gsub(" ", "\\ ", p); 
return p } { printf(" %s.%s %s ", es($1), $2, es(bn($1))); }')
Ciao,
  Void

 giusto.
Prima leggi questo 
http://tldp.org/LDP/Bash-Beginners-Guide/
e dopo posti su icoli.
E visto che ci sei ti studi anche:
http://www.grymoire.com/Unix/Awk.html
http://www.gnu.org/s/gawk/manual/


 
http://www.gnu.org/s/gawk/manual/
 
 
Già fatto, almeno per quanto riguarda le parti in questione, senza però 
raggiungere lo scopo. Non mi sembra il caso di essere caustici, comunque ho 
scritto ciò che vorrei ottenere: da un elenco di nomi di file completi di 
percorso ed estensione, vorrei estrarre i nomi completi che coincidono con 
le righe del file con a fianco i basename per poi passarli come coppie di 
parametri al comando kdialog, come nell'esempio che ho riportato.
 
 
Ciao,
  Void

 di parametri al comando kdialog, come nell'esempio che ho riportato.
 
No, non hai scritto ma stai scrivendo ora. E nell'esempio riportato 
non si capisce cosa vuoi fare. 
 
 
kdialog --menu scegli \
   $(awk '
       {
           match($0,"[^/]*$");
           printf "'%s' '%s' " , $0, substr($0,RSTART,RLENGTH)
     }'  \
    allfiles.txt )
 
 
 
 
 
 

 printf "'%s' '%s' " , $0, substr($0,RSTART,RLENGTH)
 
Piccolo bug:
 printf "'"'%s' '%s' "'" , $0, substr($0,RSTART,RLENGTH)
 
a lunedì una versione che permette apici nei nomi dei file. 
 
 


io farei in questo modo, lasciando perdere awk, visto che il problema è 
il word splitting e non ottenere il basename
Il pezzo che crea il file allfiles.txt a te non serve, l'ho usato solo 
per avere una lista di file con spazi nel path
 
 
#!/bin/bash
set -x
find . -regex ".*\ .*"  -type f -name "*.txt" >allfiles.txt
IFS=$(echo -en "\n\b")
FArray=( $(cat allfiles.txt) )
RESULT=$(kdialog --menu "seleziona file:" $(for 
((i=0;i<${#FArray[@]};i++)); do
echo "${FArray[$i]}"
echo "$(basename ${FArray[$i]})"
done) )
kate "${RESULT}"
unset IFS

Ecco  una versione che permette caratteri inusuali nei nomi
dei file, tutti tranne gli a capo.
 
while IFS=$'\n' read -r -d $'\n' 
filenae.me
 
  do
    printf "%s\n" "$filename"
    basename "$filename"
  done \
< allfiles.txt |
xargs -d $'\n' kdialog --menu scegli 
 
 
Per permettere anche gli a capo bisognerebbe impostare come 
separatore il carattere nullo ma a dovresti anche sastituire gli 
a capo con \= nel file di input:
 
cat allfiles.txt | tr '\n' '\0' | 
while IFS= read -r -d '' filename
  do
   printf "%s\0$s" "$filename" "$(basename "$filename")"
  done |
xargs -0 kdialog --menu scegli
 
 
Vedo che già hanno detto che il problema vero è la
suddivisione in parole (il /word/ /splitting/ ) , problema
che non si risolve con apici e virgolette e sostituzione
di comandi. Però prima di questo, torno a ripetere, il
problema principale È LA MANCATA LETTURA DI UN VALIDO TESTO
INTRODUTTIVO SULLA PROGRAMMAZIONE DELLA BASH.
 
Infine un proscritto: cosa vuoi fare veramente? Se devi solo
aprire dei file kdialog ha i comandi apposti; cerca di adattare
questi invece di impelagarti sul terreno paludoso.
Insomma non hai postato il tuo problema ma la tua soluzione
 
 

 unset IFS
 
 
Vedo parecchie cose che non vanno, principalmente sull'uso
degli array, ma anche quel find:
 
 find . -regex ".*\ .*"  -type f -name "*.txt" >allfiles.txt
 
Hai fatto due test -name e -regexp che fanno la stessa cosa.
 
find . -regex ".*\ .*\.txt"  -type f
 
 

 xargs -d $'\n' kdialog --menu scegli
 
Grazie mille, funziona perfettamente, anche se non ho capito però perché hai 
inserito nella prima riga "IFS=$'\n'" e "-r -d $'\n'" e nell'ultima "$". 
Non mi sembrano indispensabili:
 
media=`while read filename
  do
    basename=${filename%.*}
    printf "%s\n%s\n" "$filename" "${basename##*/}"
  done \
< allfiles.txt |
xargs -d '\n' kdialog --menu scegli`
vlc $media
 
 
Ciao e ancora grazie,
  Void

 il word splitting e non ottenere il basename
 
Grazie mille, anche questa soluzione fa quello che cercavo!
 
 
Ciao e grazie,
  Void

 vlc $media
 
Gli apici inversi sono obsoleti, usa $(...). Le virgolette fanno 
sempre bene (tranne quando rompono).
 
media=$(while IFS= ...)
vlc "$media"
 

 Gli apici inversi sono obsoleti, usa $(...). Le virgolette fanno
 
Grazie ancora!
 
 
Ciao,
  Void