我想写我的第一个shell脚本。我写的代码必须在特定数据库被修改时执行。数据库驻留在我有一个安装点的Windows服务器上。这里是我迄今为止编写的脚本:Bash脚本不访问路径中的空格文件
#!/bin/sh
DB1=/mnt/reckon/"Point of Sale Lite 2013 Administrator"/QBPOS.PDB
ls -la "$DB1"
if [ "$DB1" -nt "~/scripts/file1" ]; then
echo "Database has updated since last run"
echo "Do some stuff here"
touch file1
else
echo "Database has not been updated"
fi
不幸的是,无论如何,脚本总是等于假。这是脚本开始处的一个DB1,仅用于调试,因此我可以看到DB1声明是否成功。
这是我的文件1的LS:
[email protected] ~/scripts $ ls -l file1
-rw-r--r-- 1 pi pi 0 Jun 20 10:27 file1
这是数据库中的LS:
[email protected] ~/scripts $ ls -l /mnt/reckon/"Point of Sale Lite 2013 Administrator"/QBPOS.PDB
-rwxr-xr-x 1 root root 2048000 Jun 22 14:30 /mnt/reckon/Point of Sale Lite 2013 Administrator/QBPOS.PDB
正如你可以看到数据库文件肯定比文件1更新,但是,如果我现在运行脚本这就是我得到的:
[email protected] ~/scripts $ ./fileage
-rwxr-xr-x 1 root root 2048000 Jun 22 14:36 /mnt/reckon/Point of Sale Lite 2013 Administrator/QBPOS.PDB
Database has not been updated
[email protected] ~/scripts $
很清楚,DB1的声明正在工作,因为ls命令在脚本成功,但由于某种原因文件使用期限测试失败。我已经为此工作了几天,而且我尽可能多地进行了研究,但碰到了一堵砖墙。任何帮助将非常感激。
谢谢!
- 更新
我已经重新编写脚本,以简化尽可能多地。当使用不包含空格的路径,一切工作完全如预期,所以当我运行此脚本:
#!/bin/sh
# DB1=/mnt/qnap/Amarillo/Reckon/"Point of Sale Lite 2013 Administrator"/QBPOS.TXT
DB1=/tmp/test/file2
TF1=/home/pi/scripts/file1
ls -la "$DB1"
ls -la "$TF1"
if [ "$DB1" -nt "$TF1" ]; then
echo "Database has been updated since last run"
echo "Do some stuff here"
touch /home/pi/scripts/file1
else
echo "Database has NOT been updated"
fi
条件语句工程完全按照我期望的那样。不幸的是,当我改变测试以使用包括空格的路径时,它再次失败。这太令人沮丧了!我也尝试过使用符号链接,但同样的问题发生。
好的,所以我是堆栈溢出新手,所以我不明白这是如何标记为重复和回答?正如我在上面的更新中解释的那样,删除对代字号的所有引用使得无差别,此问题有没有任何与代字符扩展有关,如您在上面更新的代码中看到的。
如果您还没有完全阅读和理解该问题,请不要标记为已回答的问题。
您是否正在运行Ubuntu(或其衍生版)? –
您正在引用波浪号。别。 –
感谢您的回复。我在Raspberry Pi上运行Raspbian。 –