【问题标题】:Unable to set variables in bash script [duplicate]无法在 bash 脚本中设置变量 [重复]
【发布时间】:2011-01-28 09:26:06
【问题描述】:

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

#!/bin/bash
folder = "ABC"
useracct = 'test'
day = date "+%d"
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 rm $folderToBeMoved;
fi

现在我的第一个问题是我根本无法设置变量。即使是文字的,我只是让它等于一些文字。我所有的echos 都是空白的。我也抓不到日期、月份或年份,它也是空白的。

我收到一条错误消息,提示找不到 -f。

我收到一条错误消息,提示文件意外结束。

我制作了文件并做了一个chmod u+x scriptname.sh

我不确定为什么什么都没有。我对 OSX 上的这个 bash 脚本非常陌生,并且只有 windows vbscript 的经验。任何帮助都会很棒,谢谢!

【问题讨论】:

    标签: bash scripting


    【解决方案1】:

    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] 运行命令 [-f

    通常对于这种情况,请将您的代码粘贴到 shellcheck 并查看反馈。

    【讨论】:

      【解决方案2】:

      这是你修改后的脚本

      #!/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
      

      【讨论】:

        【解决方案3】:

        bash 脚本中的赋值不能在 = 周围有空格,并且您可能希望将日期命令括在 backticks $():

        #!/bin/bash
        folder="ABC"
        useracct='test'
        day=$(date "+%d")
        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 rm $folderToBeMoved; fi
        

        注释掉最后三行后,对我来说输出如下:

        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
        

        【讨论】:

        • 倒勾是邪恶的(不可嵌套)。我自己会使用 $() 。但是 +1 是一个很好的答案。
        • @paxdiablo 我自己学习使用$() 的速度非常缓慢,但是要重新编程一个 15 岁的习惯有点困难。
        • @Isaac:非常值得。我写了一个 lint 脚本,它会定期爬取~/bin 和关于反引号的 yammers。消灭他们!
        • 哦,真的 ` 与 ' 不同。很高兴知道这一点。
        • 值得指出的是,反引号实际上可以嵌套反斜杠转义,但它很快就会变得非常难看,所以$()是一个更好的选择。
        【解决方案4】:

        五个问题:

        1. 不要在等号前后放置空格。
        2. 使用"$(...)" 以文本形式获取命令输出。
        3. [ 是一个命令。在它和参数之间放置一个空格。
        4. 命令区分大小写。你想要echo。
        5. 在变量两边使用双引号。 rm "$folderToBeMoved"

        【讨论】:

        • +1,这几乎涵盖了它。 #4 对于大多数 OS X 系统来说并不准确。由于标准设置具有不区分大小写的文件系统,因此 ECHO 可以正常工作。我仍然不会推荐它,但它不会导致这个脚本出现问题。
        • Mac OS X 上的默认文件系统不区分大小写。 ECHO 和 echo 一样好用,尽管出于可移植性考虑,这不是一个明智的主意。
        • 很公平,但是ECHO 会执行可执行文件,而不是内置的 bash。
        猜你喜欢
        • 1970-01-01
        • 2019-01-05
        • 2018-10-24
        • 2018-10-01
        • 1970-01-01
        • 2021-08-29
        • 2018-08-18
        相关资源
        最近更新 更多