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
我写了这个 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