我编写了这个小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脚本中删除了它! 那为什么会显示这条消息?
谢谢和问候!
答案 0 :(得分:2)
我只想使用-p
。
mkdir -p "$HOME/dir1"
如果你传递-p
,mkdir
如果目录已经存在就不会抛出错误,那么在这种情况下它会默默地返回。
如果您想确保文件夹为空,请使用以下命令:
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