← Back to team overview

sslug-teknik team mailing list archive

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

 

donald_j_axel wrote:
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.


Det kender jeg fra C, awk ved jeg ikke noget om, shell-script har jeg ikke brugt så meget, at jeg har haft brug for at vide det. Men jeg er lidt i tvivl om dit udsagn, mener du virkelig, at shell på det punkt adskiller sig fra andre programmeringssprog?

Her finder man en anden forklaring: http://pangea.stanford.edu/computerinfo/unix/programming/shell/expressions.html
Citat:
Logical expressions.
These are usually used in if statements for conditional execution. Logical expressions always evaluate to either the value 1 if true, or value 0 if false.
citat slut.

Den forskel i brugen af wildcards, som Frank Damgaard påviser, er ejendommelig, men da jeg som nævnt ikke er shell expert, skal jeg undlade kommentarer. Jeg vil heller ikke yderligere kommentere logikken eller fornuften i denne sag, men kun håbe at Jan Holst Jensen har overvundet sin forvirring om brugen af back slash.

--
Med venlig hilsen

Jørgen Heesche
mailto:heesche@xxxxxxxxxxx
Registered Linux User #401007


Follow ups

References