Обсуждение: When scripting, which is better?
Hi all, Reading through the script files again, there seems to be several different methods of doing the same thing : i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ]; then or if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then if [ x"$foo" = x"" ]; then or if [ "$op" = "" ]; then or if [ "$foo" ]; then -- "My grandfather once told me that there are two kinds of people: those who work and those who take the credit. He told me to try to be in the first group; there was less competition there." - Indira Gandhi
Justin Clift wrote: > if [ x"$foo" = x"" ]; then This is the safest way. It prevents problems when $foo begins with with a "-" I don't know about your first question, though.
>>>>> "Justin" == Justin Clift <justin@postgresql.org> writes: Justin> if [ x"$foo" = x"" ]; then Justin> or Justin> if [ "$op" = "" ]; then Justin> or Justin> if [ "$foo" ]; then I'm not the slightest bit a shell expert, but why not :- if [ -z "$foo" ]; then Is this POSIX/SUS2/whatever ? Sincerely, Adrian Phillips -- Your mouse has moved. Windows NT must be restarted for the change to take effect. Reboot now? [OK]
> Hi all, > > Reading through the script files again, there seems to be several > different methods of doing the same thing : > > i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ]; > then The above semicolon is useless. Actually, I have never see this. The normal way is: if [ -x "$self_path/postmaster" -a -x "$self_path/psql" ] > > or > > if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then I usually do: if [ ... ]then Pretty simple. > > > > > if [ x"$foo" = x"" ]; then > > or > > if [ "$op" = "" ]; then This is done if you think $op may have a leading dash. > > or > > if [ "$foo" ]; then > This tests whether "$foo" is not equal to "". -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Sorry guys, I didn't realise I actually sent this, it was part of an email I was putting together to achieve consistency in the scripts, but I thought I cancelled it when it got late in the morning. My apologies. Regards and best wishes, Justin Clift Bruce Momjian wrote: > > > Hi all, > > > > Reading through the script files again, there seems to be several > > different methods of doing the same thing : > > > > i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ]; > > then > > The above semicolon is useless. Actually, I have never see this. The > normal way is: > > if [ -x "$self_path/postmaster" -a -x "$self_path/psql" ] > > > > > or > > > > if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then > > I usually do: > > if [ ... ] > then > > Pretty simple. > > > > > > > > > > > if [ x"$foo" = x"" ]; then > > > > or > > > > if [ "$op" = "" ]; then > > This is done if you think $op may have a leading dash. > > > > > or > > > > if [ "$foo" ]; then > > > > This tests whether "$foo" is not equal to "". > > -- > Bruce Momjian | http://candle.pha.pa.us > pgman@candle.pha.pa.us | (610) 853-3000 > + If your life is a hard drive, | 830 Blythe Avenue > + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 -- "My grandfather once told me that there are two kinds of people: those who work and those who take the credit. He told me to try to be in the first group; there was less competition there." - Indira Gandhi
Justin Clift writes: > i.e. if [ -x "$self_path/postmaster" ] && [ -x "$self_path/psql" ]; > then > > or > > if [[ -x "$self_path/postmaster" && -x "$self_path/psql" ]]; then I don't think the second one is a valid expression. ;-) Maybe you were wondering about [[ ]] vs [] -- In Autoconf [] are the quote characters so you have to double-quote, sort of. It's better to use 'test' in that case because m4 quoting can be tricky. I prefer test over [] in general because it is more consistent and slightly clearer. > if [ x"$foo" = x"" ]; then Maximum safety for the case where $foo starts with a dash. Yes, that means all comparisons should really be done that way. No, I don't think we should do it in all cases if we know what $foo can contain, because that makes code *really* unreadable. > or > > if [ "$op" = "" ]; then > > or > > if [ "$foo" ]; then These two are equivalent but the second one is arguably less clear. -- Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter