zsh-users
 help / color / mirror / code / Atom feed
From: "Benjamin R. Haskell" <zsh@benizi.com>
To: TjL <luomat@gmail.com>
Cc: Zsh Users <zsh-users@zsh.org>
Subject: Re: equivalent of "if (( $+commands[FOO] ))" for functions?
Date: Tue, 7 Aug 2012 09:17:40 -0400 (EDT)	[thread overview]
Message-ID: <alpine.LNX.2.01.1208070905130.24430@hp.internal> (raw)
In-Reply-To: <CAPHo7JfFg7D7_g6axSup1Y9pGBNR-3RZySc=qoGf9Cb+UjTMTA@mail.gmail.com>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 2396 bytes --]

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

      reply	other threads:[~2012-08-07 13:18 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-08-06 22:13 TjL
2012-08-06 22:36 ` Frank Terbeck
2012-08-06 22:38 ` Benjamin R. Haskell
2012-08-06 23:12   ` TjL
2012-08-07 13:17     ` Benjamin R. Haskell [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.LNX.2.01.1208070905130.24430@hp.internal \
    --to=zsh@benizi.com \
    --cc=luomat@gmail.com \
    --cc=zsh-users@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).