shell脚本 - 创建文件夹结构

时间:2015-05-31 14:08:44

标签: macos bash shell console

我编写了这个小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脚本中删除了它! 那为什么会显示这条消息?

谢谢和问候!

4 个答案:

答案 0 :(得分:2)

我只想使用-p

mkdir -p "$HOME/dir1"

如果你传递-pmkdir如果目录已经存在就不会抛出错误,那么在这种情况下它会默默地返回。

如果您想确保文件夹为空,请使用以下命令:

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

没有如果! if的基本问题是它不能免受竞争条件的影响。当脚本在if之后立即从CPU启动并创建“dir1”时 - 当脚本再次进入CPU时脚本将失败,因为它仍然认为该目录不存在。

答案 1 :(得分:2)

替换

[ ! -d "~/.dir1" ]

通过

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

答案 2 :(得分:1)

"~/.dir1"你在做什么是不对的。它只是字面上"~/.dir1"的目录名的另一个字符串,即~未扩展为$HOME

使用完整路径或~/".dir1"~/.dir1代替。

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

答案 3 :(得分:1)

将它放在引号中时,

~不会展开。你需要不加引号。

if [ ! -d ~/.dir1 ]

值得注意的是,您正在检查~/.dir1,但您需要.dir1。如果当前目录是~,那只是同一个目录。如果不是,那就不一样了。

此外,mkdir -p将为您执行此操作,仅在目录不存在时才创建目录。您可以将脚本简化为:

mkdir -p ~/.dir1

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