
Bash [ -z hello ] - ca98am79
https://duckduckgo.com/?q=bash+%5B+-z+hello+%5D
======
chx
And yet, the top search result is tldp. This is what #bash on freenode has to
say about that site:

> The infamous "Advanced" Bash Scripting Guide should be avoided unless you
> know how to filter out the junk. It will teach you to write bugs, not
> scripts. In that light, the BashGuide was written:
> [http://mywiki.wooledge.org/BashGuide](http://mywiki.wooledge.org/BashGuide)

Now, that site is on the second "page" of the search results.

~~~
mhurron
Do they have examples of how it's bad as opposed to simply declaring it bad?

~~~
js2
Well for example, I just skimmed through it and I don't see an explanation of
quoting, probably one of the first things I would want to explain, around the
time variables are explained. It also has examples like this:

    
    
            #!/bin/bash
            for i in $( ls ); do
                echo item: $i
            done
            

which both uselessly calls ls (you may as well just use a glob) and doesn't
work as intended if there are filenames with spaces in the directory.

You also have:

    
    
            #!/bin/bash
            for i in `seq 1 10`;
            do
                    echo $i
            done    
            
    

Why is it using backticks here instead of $() as in thr former example? Also,
no mention that seq is not available on some systems. And, you should be using
bash's sequence expression[1] anyway (added in bash 4.x), so the guide is
likely out of date.

1\.
[http://www.gnu.org/software/bash/manual/bashref.html#Brace-E...](http://www.gnu.org/software/bash/manual/bashref.html#Brace-
Expansion)

~~~
dspillett
Using ls instead of a glob can be valid if you need to force ordering for some
reason (you want to process things in date order for instance, IIRC the order
out of a glob wildcard is alphanumeric in most places and arbitrary in some).
Your point about spaces in filenames is definitely valid though but my
preferred solution to that would be to stab people with a needle every time
they put a space in a filename!

~~~
icebraining
Bah, spaces are perfectly cromulent characters. It's the bourne shell that's
broken. rc works fine with them.

~~~
dspillett
There are a great many things on the command line (less elsewhere, but still
some) that don't handle spaces in filenames well.

You are probably right that this is a technological fault rather than a
problem with spaces themselves, but IMnsHO until we are not regularly using
spaces as list item separators using them with the items being listed is
asking for issues.

------
the_french
It seems like DDG is positioning itself to become WolframAlpha for tech.
Hopefully, this will allow it to better catch the exact market segment that
would be wary of search engine tracking (educated tech-savvy people).

------
JoshTriplett
Nice! It's too bad that this doesn't actually evaluate the expression in a
sandbox, but nonetheless it's a very handy syntax guide.

It'd be nice to see option descriptions extracted from manpages: searching for
"df -h" could then produce:

    
    
           -h, --human-readable
                  print sizes in human readable format (e.g., 1K 234M 2G)

~~~
jmakeig
[http://explainshell.com](http://explainshell.com) is what you're looking for.

~~~
JoshTriplett
I'm aware of it; I'd love to see that functionality integrated into DDG.

~~~
idank
Actually one of their guys approached me last time explainshell appeared on
HN. I think he suggested I implement it as some sort of shortcut, but I
haven't had time to look into it.

I have a branch somewhere that exposes the results as JSON, which should make
it easy to integrate if they were interested.

------
Nyubis
This is pretty awesome, but I don't know if people often phrase their queries
like that, and I'm not sure whether it's worth it to start phrasing it like
this. It doesn't seem to support more complex bash queries, so I'm not really
sure how often this will be used.

~~~
mattdanger
[ is part of Bash syntax

~~~
embolalia
Nooo! Mistake #0 about shell scripting is thinking [ is syntax. It makes it
_way_ more weird and inexplicable. [ is a _command_ , just like any other.
That's why there needs to be a space between it and the next thing, and why
you have to use weird looking flags and such. This is why I prefer the command
`test`. It does the same thing as `[`, but is more obviously a command. And
when you see it as a command, it's obvious that _any_ command can be used in
an if directly; if is just checking the exit code. (Whenever I see someone
doing `if [ $? -ne 0 ]`, it makes me cry.)

~~~
jsmeaton
I'll bite. What should we be using instead of `if [ $? -ne 0 ]`? Because
that's pretty standard in my (admittedly very basic) bash.

~~~
schoen
Instead of

somecommand

if [ $? -ne 0 ]; then echo "it failed"; fi

the parent commenter presumably wants to see

if ! somecommand; then echo "it failed"; fi

~~~
viraptor
Or:

    
    
        somecommand || echo "it failed"
    

if it's just one statement. There are some cases where it just looks more
natural. For example:

    
    
        start_service || log "already started"

------
wicket
There should a dollar sign before hello, e.g.:

bash [ -z $hello ]

...or is that a bashism that I'm not aware of? If so, that's just horrible.

Personally, I prefer to write portable shell scripts. Entering "!posix test"
into DuckDuckGo to obtain the man page for "test" yields far more meaningful
information for the same problem.

~~~
simias
[ -z hello ] is perfectly fine, but hello is not a variable, it's the string
"hello". It will always return false. ddg doesn't seem to evaluate the
command, just explicit it.

~~~
wicket
> It will always return false.

Exactly! It's not the best of examples really, is it?

------
imacomputer2
"results to true if the length of 'hello' is zero." I'm glad they cleared that
up. Otherwise, I might have assumed that there was no case where 'hello' had a
length of zero. Joking aside, it is a useful syntax guide.

------
est
Damn, should draw FSA fors RegExps.

Like this

[https://www.debuggex.com/r/IC3q9sEdkKjhuLWU](https://www.debuggex.com/r/IC3q9sEdkKjhuLWU)

And explains it like this

[http://regex101.com/](http://regex101.com/)

------
d0m
As an aside, I think the new design is perfect. Good job on iterating on the
feedback!

------
pornel
More please! e.g.

    
    
         bash $?
    

is not explained.

~~~
jagtalon
If you're interested, you can add that in to
[https://github.com/duckduckgo/zeroclickinfo-
goodies/blob/mas...](https://github.com/duckduckgo/zeroclickinfo-
goodies/blob/master/lib/DDG/Goodie/BashPrimaryExpressions.pm) since it's open
source.

~~~
Crisco
I've been reading through some of those goodies, and they all seem pretty
cool, but I'm wondering how secure using the 4 word random passphrase
generator[0] would be...

[0] [https://github.com/duckduckgo/zeroclickinfo-
goodies/blob/mas...](https://github.com/duckduckgo/zeroclickinfo-
goodies/blob/master/lib/DDG/Goodie/Passphrase.pm)

~~~
mikeash
Not at all secure if you run it on DDG, since you give your password to a
third party before you even get it yourself.

~~~
rsl7
But of course you could run it ten times and pick one of them. Or modify the
instant answer to return ten or twenty. Not ideal or optimal, but there it is.

~~~
mikeash
That hardly helps at all. Now instead of knowing your exact password, your
attacker knows that your password is one of these 10-20 entries, and it's easy
to just try them all.

~~~
rsl7
Nobody has ever suggested this is a secure or ideal way to do it..

~~~
mikeash
My point is that it's not really even better.

