[[ is bash's improvement to the [ command. It has several enhancements that make it a better choice if you write scripts that target bash. My favorites are:
- 
It is a syntactical feature of the shell, so it has some special behavior that [doesn't have. You no longer have to quote variables like mad because[[handles empty strings and strings with whitespace more intuitively. For example, with[you have to write1if [ -f "$file" ]to correctly handle empty strings or file names with spaces in them. With [[the quotes are unnecessary:1if [[ -f $file ]]
- 
Because it is a syntactical feature, it lets you use &&and||operators for boolean tests and<and>for string comparisons.[cannot do this because it is a regular command and&&,||,<, and>are not passed to regular commands as command-line arguments.
- 
It has a wonderful =~operator for doing regular expression matches. With[you might write1if [ "$answer" = y -o "$answer" = yes ]With [[you can write this as1if [[ $answer =~ ^y(es)?$ ]]It even lets you access the captured groups which it stores in BASH_REMATCH. For instance,${BASH_REMATCH[1]}would be "es" if you typed a full "yes" above.
- 
You get pattern matching aka globbing for free. Maybe you're less strict about how to type yes. Maybe you're okay if the user types y-anything. Got you covered: 1if [[ $ANSWER = y* ]]
Keep in mind that it is a bash extension, so if you are writing sh-compatible scripts then you need to stick with [. Make sure you have the #!/bin/bash shebang line for your script if you use double brackets.
#See also
- Bash FAQ - "What is the difference between test, [and[[?"
- Bash Practices - Bash Tests
- Server Fault - What is the difference between double and single brackets in bash?
原问题链接:https://stackoverflow.com/questions/3427872/whats-the-difference-between-and-in-bash