无法在 bash 脚本中设置变量 [重复]

Posted

技术标签:

【中文标题】无法在 bash 脚本中设置变量 [重复]【英文标题】:Unable to set variables in bash script [duplicate] 【发布时间】: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 的经验。任何帮助都会很棒,谢谢!

【问题讨论】:

【参考方案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】:

五个问题:

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

【讨论】:

+1,这几乎涵盖了它。 #4 对于大多数 OS X 系统来说并不准确。由于标准设置具有不区分大小写的文件系统,因此 ECHO 可以正常工作。我仍然不会推荐它,但它不会导致这个脚本出现问题。 Mac OS X 上的默认文件系统不区分大小写。 ECHOecho 一样好用,尽管出于可移植性考虑,这不是一个明智的主意。 很公平,但是ECHO 会执行可执行文件,而不是内置的 bash。

以上是关于无法在 bash 脚本中设置变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查bash中的空环境变量[重复]

如何在postgres中设置日期变量[重复]

使用 subprocess.Popen() 在 python 脚本中设置 PYTHONPATH 失败 [重复]

在python脚本中设置环境变量

在变量中设置生成器函数的结果[重复]

无法在对 jQueryLite 的 CSS 调用中设置重复属性