bash脚本找不到mkdir

时间:2013-12-28 10:59:33

标签: bash shell osx-mavericks

我创建了一个简单的脚本来检查文件夹是否存在以及是否创建它。

后面的脚本
#!/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 - 文件顶部的开头语句和"默认"之间是否有任何关系?文件夹?

由于

2 个答案:

答案 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作为变量的名称(使用它来列出要搜索命令的目录)。
  • 请了解standard environment variable names的列表以及您使用的shell特有的列表(例如bash shell variables)。或者使用简单的启发式:保留名称是大写的,因此对脚本本地的变量使用小写名称。 (大多数环境变量都是大写的 - 标准的或非标准的。)

您可以使用以下命令确保目录存在:

mkdir -p ~/Dropbox/Web_Development

如果已经存在,则不会造成任何伤害。如果它不存在,则创建它,并且如果缺少该目录的路径上所需的任何其他目录(例如~/Dropbox)。