sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #85977
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