我实际上正在阻止一件愚蠢的事情......但我无法完成它。
我们有一个 git 存储库,其中有 php 文件和 sql 补丁。每次我更新我的仓库时,我都必须检查是否需要打任何sql补丁。为了避免搜索哪个要玩,我制作了一个小脚本,为我提供了我上次 git pull 给我的每个 sql 文件:
find $MY_DIR/scripts/sandbox/migrations -type f -newermt $(date +'%Y-%m-%d') ! -newermt $(date +'%Y-%m-%d' --date="tomorrow") -not -path "$MY_DIR/scripts/sandbox/migrations/generated/*"
这给了我和输出,看起来像这样
/home/carpette/www/myFolder/scripts/sandbox/migrations/done/2017.12.14 - script1.sql
/home/carpette/www/myFolder/scripts/sandbox/migrations/done/2017.09.28 - script2.sql
/home/carpette/www/myFolder/scripts/sandbox/migrations/done/2017.12.15 - script3.sql
/home/carpette/www/myFolder/scripts/sandbox/migrations/done/2017.12.12 - script4.sql
现在,我正在尝试在 mysql 中自动获取这些文件。我尝试过做这样的事情:
mysql myDataBase < $(./myStript.sh)
但我收到一条错误消息ambiguous redirection
。
所以我尝试了:
cat $(./myScript.sh) | mysql myDataBase
但现在,我的文件名路径中包含的空间被阻塞,并且 mysql 说“没有现有文件”,因为它仅/home/carpette/www/myFolder/scripts/sandbox/migrations/done/2017.09.28
作为文件名路径。
我想我必须摆脱空白,但我找不到任何有效的优雅解决方案。
更新:我想保持 myScript.sh 独立,这样我就可以在其他事情上使用它。
答案1
./myStript.sh | while read line
do
mysql myDataBase < "$line"
done
运行脚本并逐行获取输出,将结果作为文件路径传递给 mysql 以供其读取和处理。向 $line 变量(文件路径)添加引号以考虑空格。
答案2
就像是
find $MY_DIR/scripts/sandbox/migrations -type f \ -newermt $(date +'%Y-%m-%d') ! \ -newermt $(date +'%Y-%m-%d' --date="tomorrow") \ -not -path "$MY_DIR/scripts/sandbox/migrations/generated/*" \ -exec msqlclient MyDatabase -u $USER -h $HOST -p < "{}" \;
根据需要替换 $USER 和 $HOST