我最近将服务器从 Ubuntu 14.04.1 移至 18.04,并逐步移动数据和脚本等。
我有一个脚本,每天早上以日期的形式创建一个文件夹,例如 20201017 表示 2020 年 10 月 17 日。它在 Ubuntu 14.04.1 上运行良好,但在 18.04 上行为异常。
foldername='$(date +'%Y%m%d')'
mkdir -p /var/www/ .... /old/$foldername
我也尝试过许多其他版本,
mkdir /var/www/ ... /old/`date +%Y%m%d'
而不是生成 20201017,而是生成 '20201017'$'\r'
任何帮助都将不胜感激,也许可以防止我秃顶。
答案1
改变这个:
foldername='$(date +'%Y%m%d')'
对此:
foldername="$(date +'%Y%m%d')"
答案2
看起来您已经在 Windows 中编辑了脚本,将标准 UNIX 行尾 ( \n
) 转换为 Windows 行尾 ( \r\n
)。您可以使用以下命令进行测试cat -V
:
cat -v yourScript.sh
你会看到类似这样的内容:
$ cat -v yourScript.sh
foldername='$(date +'%Y%m%d')'^M
mkdir -p /var/www/ .... /old/$foldername^M
其中^M
是\r
,您需要将其删除。最简单的方法是安装dos2unix
并运行:
dos2unix yourScript.sh
或者,您可以在 sed 中执行此操作:
sed -i 's/\r//g' yourScript.sh
此后,您的脚本应该可以按预期工作。但是,您也应该借此机会进行一些小改进,并将其更改为:
mkdir -p /var/www/ .... /old/"$(date +'%Y%m%d')"
没有理由为 设立一个单独的变量foldername
,但更重要的是,你应该总是引用你的变量。因此,即使保留第二个变量,也请使用:
## Actually run the command now, otherwise, the foldername
## will change if your script runs at 11:59 and takes more than a second.
foldername=$(date +'%Y%m%d')
mkdir -p /var/www/ .... /old/"$foldername"