Am 11.01.2013 22:34, schrieb Dan Douglas: > On Friday, January 11, 2013 09:48:32 PM John Kearney wrote: >> Am 11.01.2013 19:27, schrieb Dan Douglas: >>> Bash treats the variable as essentially undefined until given at least an >>> empty value. >>> >>> $ bash -c 'typeset -i x; [[ -v x ]]; echo "$?, ${x+foo}"; typeset -p x' >>> 1, >>> bash: line 0: typeset: x: not found >>> $ ksh -c 'typeset -i x; [[ -v x ]]; echo "$?, ${x+foo}"; typeset -p x' >>> 0, >>> typeset -i x >>> >>> Zsh implicitly gives integers a zero value if none are specified and the >>> variable was previously undefined. Either the ksh or zsh ways are fine IMO. >>> >>> Also I'll throw this in: >>> >>> $ arr[1]=test; [[ -v arr[1] ]]; echo $? >>> 1 >>> >>> This now works in ksh to test if an individual element is set, though it >>> hasn't always. Maybe Bash should do the same? -v is tricky because it adds >>> some extra nuances to what it means for something to be defined... >>> >> Personally I like the current behavior, disclaimer I use nounset. >> I see no problem with getting people to initialize variables. > How is this relevant? It's an inconsistency in the way set/unset variables > are normally handled. You don't use variadic functions? Unset variables / > parameters are a normal part of most scripts. > >> it is a more robust programming approach. > I strongly disagree. (Same goes for errexit.) > :) we agree on errexit however SIGERROR is another matter quite like that. Note the only reason I don't like errexit is because it doesn't tell you why it exited, nounset deos.
no unset is very valuable. during the entire testing and validation phase. Admittedly bash is more of a hobby for me. but I still have unit testing for the function and more complex harness testing for the higher level stuff. Before I ship ship code I may turn it off but normally if its really critical I won't use bash for it anyway, I mainly use bash for analysis. as such if bash stops because it finds a unset variable it is always a bug that bash has helped me track down. I guess it also depends on how big your scripts are I guess up to a couple thousand lines is ok but once you get into the 10s of thousands to keep your sanity and keep a high reliability you become more and more strict with what you allow, strict naming conventions and coding styles. setting nounset is in the same category of setting warnings to all and and treat warnings as errors. but then again I do mission critical designs so I guess I have a different mindset.