Re: using mail in scripts
On Tue, Nov 13, 2007 at 03:32:39PM +0000, cs wrote:
> Folks, I have a bash script and I wanted to be able to catch a situation
> and then send an email to the user flagging this. However, the -s to
> `mail` doesn't allow spaces and I cannot work out, despite several
> attempts, how to escape/quote etc in order to do what I want. Here's
> what I'd like to do:
>
> #!/bin/bash -x
> TEMPFILE=`mktemp /tmp/chk_procs_XXX`
> trap 'date|mail -s "$0 error" michael@there.com;echo Error - aborting;\
> exit' ERR
>
> ### only allow one instance of this per user to run at a given time
> ps -elf|grep $0|grep -v grep > $TEMPFILE
> if [[ `cat $TEMPFILE | wc -l` -gt 1 ]]; then
> #cat $TEMPFILE
> date | mail -s '${0} already Running' michael@here.com
> rm $TEMPFILE
> exit -1
> fi
> rm $TEMPFILE
>
>
> but that mails the string $0 not the value. Removing the quotes results
> in an error.
>
> Any ideas?
> Thanks, M
The convention in Bash (also other shells, Perl, etc.) is to use double
quotes (") and single quotes (') to group a bunch of text into a single
token, so one or the other (*) is needed to have a single value to go with
the -s option in your example. Inside double quotes, though, shell variables
and \ escapes are expanded, so that would give you the result you're after.
There's a section in the bash(1) manpage on quoting that covers this in
typically excrutiating detail...
(*) You can alternatively escape the spaces in your example by preceding
them with a backslash, e.g,.
date | mail -s ${0}\ already\ Running michael@here.com
would also work.
Ken
--
Ken Irving, fnkci+debianuser@uaf.edu
Reply to: