shell 脚本 - 创建文件夹结构

shell script - creating folder structure

我写了这个 shell 脚本 (test.sh) 来创建一个基本的文件夹结构:

#!/bin/bash

# Check if directory already exists,
# if it doesnt, create one.
if [ ! -d "~/.dir1" ]; then
        mkdir ".dir1"
else
        rm -rf ".dir1"
        mkdir ".dir1"
fi

当我运行

test.sh

在控制台中,创建隐藏文件夹。

但是: 当我再次 运行 它告诉我:

mkdir: .dir1: File exists

但它可能存在,因为我在创建新脚本之前在 shell 脚本中删除了它! 那么为什么会显示这条信息呢?

谢谢和问候!

我会简单地使用 -p

mkdir -p "$HOME/dir1"

如果您传递 -p,如果目录已经存在,mkdir 将不会抛出错误,在这种情况下它会简单地 return。

如果你想确保文件夹是空的,使用这个:

rm -rf "$HOME/dir1"
mkdir -p "$HOME/dir1"

没有如果! if 的基本问题是它无法抵抗竞争条件。当脚本在 if 之后从 CPU 开始 - 并创建 "dir1" - 你的脚本将在再次进入 CPU 时失败,因为它仍然认为目录没有存在。

替换

[ ! -d "~/.dir1" ]

来自

[ ! -d "${HOME}/.dir1" ]

"~/.dir1" 你的做法是不对的。它只是目录名称的另一个字符串 "~/.dir1"~ 不会扩展为 $HOME.

改用完整路径或 ~/".dir1"~/.dir1

您也可以使用 $HOME$HOME/.dir1"$HOME/.dir1""$HOME"/".dir1" 所有这些都会产生相同的结果...但是引用变量是一种很好的做法。

~ 放在引号中时不会展开。您需要不加引号。

if [ ! -d ~/.dir1 ]

请注意,您检查的是 ~/.dir1,但检查的是 .dir1。如果当前目录是 ~,那只是相同的目录。如果不是,则它们不相同。

另外,mkdir -p 会为您做这件事,只有当目录不存在时才创建目录。您可以将脚本简化为:

mkdir -p ~/.dir1

rm -rf ~/.dir1
mkdir ~/.dir1