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