无法在bash脚本中设置变量

无法在bash脚本中设置变量,bash,scripting,Bash,Scripting,我尝试每天晚上使用从AppleScript按计划运行的bash脚本自动将文件从文件夹移动到新文件夹。我试图在MacOSX上编写bash脚本,但一直失败。简而言之,这就是我所拥有的(我所有的echos都用于错误检查): 现在我的第一个问题是我根本不能设置变量。即使是字面意义上的,我只是让它等于一些字面意义上的。我所有的echos结果都是空白的。我也抓不到日期、月份或年份,结果也是空白的 我得到一个错误,说没有找到-f 我收到一个错误,说文件有意外的结尾 我制作了这个文件并做了一个chmodu+xs

我尝试每天晚上使用从AppleScript按计划运行的bash脚本自动将文件从文件夹移动到新文件夹。我试图在MacOSX上编写bash脚本,但一直失败。简而言之,这就是我所拥有的(我所有的
echo
s都用于错误检查):

现在我的第一个问题是我根本不能设置变量。即使是字面意义上的,我只是让它等于一些字面意义上的。我所有的
echo
s结果都是空白的。我也抓不到日期、月份或年份,结果也是空白的

我得到一个错误,说没有找到-f

我收到一个错误,说文件有意外的结尾

我制作了这个文件并做了一个
chmodu+xscriptname.sh

我不知道为什么什么都不管用。我对OSX上的这个bash脚本非常陌生,只对windows vbscript有经验。任何帮助都会很好,谢谢

五个问题:

  • 不要在等号前后加空格
  • 使用
    “$(…)”
    以文本形式获取命令的输出
  • [
    是一个命令。在它和参数之间留一个空格
  • 命令区分大小写。您需要
    echo
  • 在变量周围使用双引号。
    rm“$folderToBeMoved”

  • bash脚本中的赋值不能在
    =
    周围有空格,您可能希望日期命令包含在反勾号
    $()
    中:

    最后三行被注释掉后,对我来说,这输出:

    Network is 
    day is 16
    Month is March
    YEAR is 2010
    source is /users/test/Documents/Archive/Primetime.eyetv
    dest is /Volumes/Media/Network/ABC/March162010
    

    这是你修改过的剧本

    #!/bin/bash    
    folder="ABC" #no spaces between assignment    
    useracct='test'    
    day=$(date "+%d") # use $() to assign return value of date command to variable    
    month=$(date "+%B")     
    year=$(date "+%Y")    
    folderToBeMoved="/users/$useracct/Documents/Archive/Primetime.eyetv"    
    newfoldername="/Volumes/Media/Network/$folder/$month$day$year"    
    ECHO "Network is $network" $network    
    ECHO "day is $day"    
    ECHO "Month is $month"    
    ECHO "YEAR is $year"    
    ECHO "source is $folderToBeMoved"    
    ECHO "dest is $newfoldername"    
    
    mkdir "$newfoldername"    
    cp -R "$folderToBeMoved" "$newfoldername"
    if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- put a space at square brackets and quote your variables.
     rm "$folderToBeMoved";
    fi
    
    !/bin/bash
    folder=“ABC”#作业之间没有空格
    useracct='test'
    day=$(date“+%d”)#使用$()将date命令的返回值分配给变量
    月份=$(日期“+%B”)
    年份=$(日期“+%Y”)
    folderToBeMoved=“/users/$useracct/Documents/Archive/Primetime.eyetv”
    newfoldername=“/Volumes/Media/Network/$folder/$month$day$year”
    ECHO“网络是$Network”$Network
    ECHO“一天就是$day”
    ECHO“月是$Month”
    ECHO“年是$YEAR”
    ECHO“源为$folderToBeMoved”
    ECHO“dest是$newfoldername”
    mkdir“$newfoldername”
    cp-R“$folderToBeMoved”“$newfoldername”
    如果[-f“$newfoldername/Primetime.eyetv”];则#
    folder=“ABC”
    尝试运行名为
    folder
    的命令,参数为
    =
    “ABC”
    。bash中的命令格式为:

    command arguments separated with space
    
    当任务完成时:

    variable=something
    

    • [-f$newfoldername/Primetime.eyetv]
      中,
      [
      是一个命令(
      test
      ) 和
      -f
      $newfoldername/Primetime.eyetv]
      是两个参数 需要找不到的第三个参数(
      ]
      )(参数必须为 用空格分隔),因此将显示错误
    • [-f$newfoldername/Primetime.eyetv]
      尝试运行带有参数
      $newfoldername/Primetime.eyetv]

    一般来说,对于这种情况,请粘贴代码并查看反馈。

    +1,这几乎涵盖了它#但对于大多数OSX系统来说,4并不准确。由于标准设置有一个不区分大小写的文件系统,ECHO就可以正常工作。我仍然不推荐它,但它不会导致这个脚本出现问题。Mac OS X上的默认文件系统不区分大小写
    ECHO
    ECHO
    一样有效,尽管对于可移植性来说这不是一个明智的想法。这很公平,但是
    ECHO
    执行可执行文件,而不是bash内置。Back ticks是邪恶的(不可嵌套的)。我自己会用美元。但是+1是一个很好的答案。@paxdiablo我自己正在慢慢地学习使用
    $()
    ,但是要重新编程一个15年的习惯有点困难。@Isaac:这太值得了。我编写了一个lint脚本,它周期性地抓取
    ~/bin
    ,并对backticks发牢骚。清除他们!哦,真的“不同于”。知道这一点真的很好。值得指出的是,反斜杠实际上可以嵌套在反斜杠转义中,但它很快就会变得非常丑陋,所以
    $()
    是一个更好的选择。
    command arguments separated with space
    
    variable=something