Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: equivalent of "if (( $+commands[FOO] ))" for functions?



On Mon, 6 Aug 2012, TjL wrote:

On Mon, Aug 6, 2012 at 6:38 PM, Benjamin R. Haskell wrote:
In case you've only seen the idiom you're using, and didn't have an explanation:

$+param expands to 0 if param is unset, and 1 if it's set. The double parentheses: (( ... )) just make the conditional "mathy" (so that non-zero is true). So, you can use this with your own associative arrays, too:

typeset -A some_array
some_array+=( foo some-foo-thing )
if (( $+some_array[foo] ))
then
    echo yay
fi

Ah, that's helpful, thanks. Indeed I have just been copy/pasting this without really knowing how it worked.

Hrm… so… I often do something like this to do different things based on the exit status of a given command 'foo'

For example:

	foo

	EXIT="$?"

	if [ "$EXIT" = "0" ]
	then
		# do whatever

	else
		echo "$0: failed (\$EXIT = $EXIT)"

		exit 1
	fi

Unless there's a command in between 'foo' and 'EXIT="$?"', this is cleaner:

if foo
then
    # do whatever
else
    echo "$0: failed (\$EXIT = $?)"
    exit 1
fi



Is there a way to do something like that with $+param?

You don't need the '+' in $+param. The '+' tests for whether the parameter is set, and changes the return to 0 or 1. $EXIT will always be set, and isn't an associative array (It's just a normal parameter).


I tried this:

	EXIT+=( test -d ~/etc )

	if (( $+EXIT[test] ))
	then
		echo yes
	else
		echo no
	fi

test -d ~/etc
ERROR=$?

if (( ! ERROR ))
then
    echo yes
else
    echo no
fi

I've written 'ERROR' rather than 'EXIT' here, because the "truthy" value of command returns (0) and the "truthy" value expected by ((...))-style parens (non-zero) are reversed.


thinking that it would say 'yes' if 'test -d' exited with status = 0 or 'no' with any other status, but that didn't seem to work (I always seem to get no even if 'test -d' should return 0.

The way you'd written it, EXIT will be an array (a normal array, not an associative array) with the values:

EXIT[1]=test
EXIT[2]=-d
EXIT[3]=~/etc

Then, since EXIT isn't an associative array, testing whether it has the key 'test' always returns false.


So I assume that I'm misunderstanding something, possibly trying to make apple pie uses oranges and wondering why it doesn't taste right.

Good analogy. :-)

--
Best,
Ben


Messages sorted by: Reverse Date, Date, Thread, Author