← Back to team overview

sslug-teknik team mailing list archive

Re: Bash-mystik - eller er det xview der driller ?

 

On Fri, 02 Dec 2005 20:56:08 +0000
Jørgen wrote:

> > 
> skip
> 
> >>
> >> Det kan godt være at det er konsistent opførsel, men
> >> det er altså dybt ulogisk. Er der nogen der kan give
> >> en logisk sammenhængende forklaring på bash's opførsel
> >> ? Eller er svaret bare: Skriv alle dine scripts i
> >> Python :-) ?
> 
> Det en helt konsistent og 100% logisk opførsel, som virker på samme måde 
> i alle scriptsprog, også Phyton.

For den uindviede: Nedenstående er en dybt involverende diskussion
som ikke kan forstås uden grundigt kendskab til programmering og
til manual page for bash og evt. for ksh, Korn-shell'en.

... 100% logisk? Joeh, strengt taget, men "logisk" kan også betyde
"fornuftig" udenfor datalogiens verden:

Man skal derfor måske tilføje, at en erfaren script-forfatter som
David Korn, der har lagt navn og kode til Korn-Shell'en, som igen
har givet meget til POSIX-shell-definitionen, der er grundlaget
for BASH ... --  David Korn skriver i sine scripts, når han er
kommet ud over de første linier, flg.:

set -f 

# set -f betyder: Ikke mere wildcard-expansion.
#
# Klippet væk: diverse handling af options, 
# Nu tager vi filerne og læser dem,
# i dette script, linie for linie:

for fnam in "$@"''
do
   [[ -n $fnam ]] && exec 0< $fnam   # aabn fil hvis noedv.
   while read linie
   do
   ...
   done
done

set -f fjerner fejlmuligheder ved dobbeltfortolkning af wildcards,
d.v.s. "*" og "?".

"$@" betyder at arg-vector behandles med mellemrum som tilhørende
den expanderede variable (Korn forklarer helst sådan noget med
exempler) og den sidste '' betyder, at hvis "$@" ikke indeholder
noget, så får vi dog en TOM fnam variabel (i modsætning til INGEN 
variabel!

Så kom ikke og sig at det ikke er counterintuitivt - det må
begynderen helt naturligt føle  --  og have lov til at føle.

Som Frank Damgaard har forklaret tidligere:

$ set alfa beta "delta airplanes"

$ echo $3
delta airplanes

$ for t in $* ; do echo $t ; done
alfa
beta
delta
airplanes

$ for t in $@ ; do echo $t ; done
alfa
beta
delta airplanes


I jagten på en konklusion overvejes flg.:

    awk, C: Et udtryk er sandt, hvis det er forskelligt fra 0
    shell:  Et udtryk er falsk, hvis det er forskelligt fra 0.

    Logik definerer ikke sandheden, logik defineres af mennesker.


-- 
donald_j_axel donax snabela get2net.dk -- http://d-axel.dk/


Follow ups

References