I have a question about expressing test files in bash. Here is a simple script to illustrate my question:
set -x read -p "Enter a filename: " var1 if [ - e $var1 ] then echo file exists else echo file not found fi 
There are three scenarios:
- At the command prompt, enter foo, which is the file that exists in the directory from which I am running the script. As expected, the output offile exists.
- At the command prompt, enter bar. There is no such file in the directory from which I am running the script. As expected, the output isfile not found.
- At the command prompt, I pressed <enter>without typing anything. Surprisingly, the output offile exists.
If I use if [[ -e $var1 ]] , i.e. double brackets instead of single brackets, the behavior is correct: even in the third case, I get file not found .
I stuck set -x at the top of the file to find out what was going on. In separate brackets, the variable is evaluated as: '[' -e ']' . With a double, it is rated as [[ -e '' ]] . It is interesting. Why is the expression evaluated differently in these two cases?
I would be grateful for the explanation. Sorry if I miss the obvious. Thanks!
source share