无法在 bash 脚本中设置变量 [重复]
Posted
技术标签:
【中文标题】无法在 bash 脚本中设置变量 [重复]【英文标题】:Unable to set variables in bash script [duplicate] 【发布时间】:2011-01-28 09:26:06 【问题描述】:我正在尝试使用按计划从 AppleScript 运行的 bash 脚本每晚自动将文件从文件夹自动移动到新文件夹。我正在尝试在 Mac OSX 上编写 bash 脚本,但一直失败。简而言之,这就是我所拥有的(我所有的echo
s 都用于错误检查):
#!/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
现在我的第一个问题是我根本无法设置变量。即使是文字的,我只是让它等于一些文字。我所有的echo
s 都是空白的。我也抓不到日期、月份或年份,它也是空白的。
我收到一条错误消息,提示找不到 -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 上的默认文件系统不区分大小写。ECHO
和 echo
一样好用,尽管出于可移植性考虑,这不是一个明智的主意。
很公平,但是ECHO
会执行可执行文件,而不是内置的 bash。以上是关于无法在 bash 脚本中设置变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章