我创建了一个简单的脚本来检查文件夹是否存在以及是否创建它。
后面的脚本#!/bin/bash
PATH=~/Dropbox/Web_Development/
FOLDER=Test
if [ ! -d $PATH$FOLDER ]
then
echo $PATH$FOLDER 'not exists'
/bin/mkdir $PATH$FOLDER
echo $PATH$FOLDER 'has been created'
fi
仅当mkdir命令以/ bin /开头时,才有效。如果失败了,bash env会输出错误消息"命令无法找到"。
我虽然这可能与系统$ PATH变量有关,但它看起来是常规的(对我来说),输出如下:
/Library/Frameworks/Python.framework/Versions/2.7/bin:/bin:/usr/local/bin:/usr/bin:/sbin:/usr/local/sbin:/usr/sbin
我不确定列出了不同bin文件夹的订单是否有任何区别,但/ bin one(我的OSX Maverick上的mkdir)似乎存在,因此我希望bash能够能够执行这个。
实际上,如果我从终端调用bash命令,只需键入mkdir bash输出帮助字符串即可告诉我应该如何使用mkdir命令。这表明我在第一时间bash能够识别$ PATH变量。
那可能是什么原因?我的.sh - #!/ bin / bash - 文件顶部的开头语句和"默认"之间是否有任何关系?文件夹?
由于
答案 0 :(得分:4)
是的,有时候使用大写字母表示常量变量是个坏主意,因为有些默认值使用相同的约定。您可以看到一些默认变量here(滚动到Special Parameters and Variables
部分)。因此,如果您不想发生任何冲突,最好使用长名称
另外需要注意的是,您正在尝试复制mkdir -p
功能,如果它不存在则会创建一个文件夹(也会创建所有父项,这在大多数情况下都是您需要的)
还有一件事 - 你总是要引用变量,否则它们会被扩展。这可能会导致一些严重的问题。想象一下
fileToRemove='*'
rm $fileToRemove
此代码将删除当前文件夹中的所有文件,而不是您所期望的名为*
的文件
还有一件事,你应该将路径与/
的文件夹分开。像这样"$MY_PATH/$MY_FOLDER"
。如果您忘记在路径变量中包含/
字符,则应该这样做。有两个斜杠没有坏处,这意味着/home/////////user///
文件夹与/home/user/
文件夹完全相同。
有时让~
工作很棘手,因此使用$HOME
会更安全,更可读。
所以这是你修改过的脚本:
#!/bin/bash
MY_PATH="$HOME/Dropbox/Web_Development/"
MY_FOLDER='Test'
mkdir -p "$MY_PATH/$MY_FOLDER"
答案 1 :(得分:1)
问题是您的脚本将PATH
设置为单个目录,并且该单个目录不包含名为mkdir
的程序。
PATH
作为变量的名称(使用它来列出要搜索命令的目录)。bash
shell variables)。或者使用简单的启发式:保留名称是大写的,因此对脚本本地的变量使用小写名称。 (大多数环境变量都是大写的 - 标准的或非标准的。)您可以使用以下命令确保目录存在:
mkdir -p ~/Dropbox/Web_Development
如果已经存在,则不会造成任何伤害。如果它不存在,则创建它,并且如果缺少该目录的路径上所需的任何其他目录(例如~/Dropbox
)。