ChatGPT解决这个技术问题 Extra ChatGPT

How to use Bash to create a folder if it doesn't already exist?

#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

This doesn't seem to work. Can anyone help?

Why do you have semicolons?
The ; token is a command separator, so is newline. As then is a separate command, the preceding semicolon is needed to be be able to write it in the same line. The semicolons after mkdir and fi are superflous.

k
konsolebox

First, in Bash [ is just a command, which expects string ] as a last argument, so the whitespace before the closing bracket (as well as between ! and -d which need to be two separate arguments too) is important:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

Second, since you are using -p switch for mkdir, this check is useless, because this is what it does in the first place. Just write:

mkdir -p /home/mlzboy/b2c2/shared/db;

and that's it.


Note: the -p flag causes any parent directories to be created if necessary.
My god, I've never knew that "[" is a command. This explains so many of my problems... Easily the most useful thing I've ever read on StackOverflow.
Wow! Knowing that "[" is a command in bash is such an eye-opener. I feel like a lot of issues with my bash scripts are now resolved!
Incredible to find out that "[" is a command. That's made a lot of things click for me that didn't make sense before. Thank you!
How to check using Regex to identify the folder? Ex: if [ ! -d /home/mlzboy/b2*/shared/db ];
k
kurumi

There is actually no need to check whether it exists or not. Since you already wants to create it if it exists , just mkdir will do

mkdir -p /home/mlzboy/b2c2/shared/db

Note: the -p flag causes any parent directories to be created if necessary.
A
Automatico

Simply do:

mkdir /path/to/your/potentially/existing/folder

mkdir will throw an error if the folder already exists. To ignore the errors write:

mkdir -p /path/to/your/potentially/existing/folder

No need to do any checking or anything like that.

For reference:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


The argument -p doesn't exactly ignore errors: it invokes a different mode where any path components that don't exist are created (and hence it is not an error if happens that zero need to be created). The behavior is different since it will create components other than the last one, which may or not be desirable.
d
dogbane

You need spaces inside the [ and ] brackets:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

p
plesiv

Cleaner way, exploit shortcut evaluation of shell logical operators. Right side of the operator is executed only if left side is true.

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

mmh, not cleaner: just shorter. It's difficult to understand the meaning of such a statement if you come across it.
I like this, although the -p argument makes the check unnecessary. You can still use it when you don't want to use -p, that is when you don't want all the parent directories to be created automatically.
Actually it's even shorter to write [ -d /path/to/dir ] || mkdir /path/to/dir .. right side is executed when the left side is false.
i
ivy

I think you should re-format your code a bit:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

J
Jason

Create your directory wherever

OUTPUT_DIR=whatever

if [ ! -d ${OUTPUT_DIR} ]
then
    mkdir -p ${OUTPUT_DIR}
fi