【问题标题】:BASH variable in string字符串中的 BASH 变量
【发布时间】:2016-10-05 15:33:33
【问题描述】:

此脚本 1 未按预期工作。我将在下面解释:

#!/bin/bash
### SETUP ###
USER="MYUSER"
DIRS="MYDIR"
BUCKET="mybucket"
DOACCESS="ACCESSKEY"
DOSECRET="SECRETKEY"
NAME="FILENAME"
EXPIRE="7 days"
NOW=$(date +"%d-%m-%Y")
DAY=$(date +"%a")

# ...lots of code that is working great...

### CLEAN OLD FILE FROM BUCKET ###

### This is the line that I am having issues with.
sh ./s3-del-old.sh ''"${BUCKET}"'/backup' '"${EXPIRE}"'

END

script2 得到了copied from here

在遵循一些关于 Bash 的说明之前我所拥有的:下面链接的单引号中的变量是:

sh ./s3-del-old.sh "$BUCKET/backup" "$EXPIRE"

这不起作用,在运行 bash 脚本时被忽略。

我试图省略与以下问题无关的内容,尽管我相信我可能会混淆。为此我深表歉意。很简单,我在script1 中有一条线调用另一个script2。我使用变量来满足脚本的需要。它不起作用,我在网上找不到易于理解的解决方案,因此需要发布问题。

----更新结束----

我查看了一些已回答的问题,但我没有找到适合我的需求或我可以完全理解以用于我​​的需求的解决方案。

我有tried following this,不过我需要更多帮助。

这就是我想要做的:

我有一个备份脚本,它使用 DreamHost 的 DreamObjects 来存储我的备份。 DreamObjects 令人讨厌的部分是它没有任何用于删除 x 天前创建的文件的内置功能。因此我的问题。我想从我的 bash 文件中添加对 bash 文件的调用。如果这是有道理的。 :) 如果没有,下面有问题的代码,你应该能看懂。

我真的希望能够将代码添加到我当前的脚本中,而不是使用单独的文件。我只是不知道如何正确地重写它而不花费比我更多的时间。我found the code at

我的变量对这个问题很重要:

BUCKET="mybucket"<br>
EXPIRE="7 days"

这是调用文件的行:

sh ./s3-del-old.sh ''"${BUCKET}"'/backup' '"${EXPIRE}"'

这为我提供了日期错误:

invalid date `-"${EXPIRE}"'

该文件使用以下语法工作:

s3-del-old "bucket" "30 days"

当我在命令行中单独使用它时,它确实工作得很好,我只想将调用添加到一个文件中,这样我就可以使用一个 cronjob 而不是两个。另外,通过这种方式,我可以通过更改变量将脚本与我的任何域/存储桶一起使用。 :)

【问题讨论】:

  • 您的意思是 BUCKET 变量正确传递但只有 EXPIRE 失败?如果是这样,EXPIRE 是否需要是一个变量?
  • 参数'"${EXPIRE}"' 在单引号' "${EXPIRE}" ' 内。单引号内的 shell 变量不展开。这是你想做的吗?如果您需要更多帮助,请提供使用'"${EXPIRE}"' 的脚本部分。
  • 我想你只需要这个:sh ./s3-del-old.sh "$BUCKET/backup" "$EXPIRE"
  • @StefanoMaffulli EXPIRE 是用于确定删除内容的天数变量。我想我不需要它是一个变量,尽管我仍然想了解它应该如何完成。由于我的文件正在上传到存储桶,因此存储桶变量传递给脚本。我不确定有问题的线路。
  • @sorontar 使用 EXPIRE 的脚本部分包含在问题中(这是调用文件的行:sh ./s3-del-old.sh ''"${BUCKET} "'/backup' '"${EXPIRE}"')。我将变量声明为 BUCKET="mybucket" 和 EXPIRE="7 days"。

标签: bash dreamhost s3cmd


【解决方案1】:

您需要调用的“其他脚本”是a bash script

如果调用为 sh,bash 脚本(通常)将不起作用,就像你正在做的那样:

sh ./s3-del-old.sh ''"${BUCKET}"'/backup' '"${EXPIRE}"'

请用 bash 调用脚本:

bash ./s3-del-old.sh "${BUCKET}"/backup "${EXPIRE}"

或者更好的是,让脚本选择应该运行它的 shell:

./s3-del-old.sh "${BUCKET}"/backup "${EXPIRE}"

随着文件s3-del-old.sh的shebang:

#!/bin/bash

【讨论】:

  • 谢谢,我觉得我已经接近了,或者这可能是答案,尽管我确实收到了以下错误:错误:参数问题:期望 S3 URI 带有文件名或 --recursive:s3: //webbk/备份/
  • 你在错误的地方设置变量,也许吧?我的印象是你的脚本现在是意大利面条 :) 而不是调用调用脚本的脚本,使用 bash 函数并清理你的代码。
  • @StefanoMaffulli 哇!我不知道你能读懂我的代码就知道它是意大利面条。哈哈! script2(s3-del-old.sh)的代码我没有写,我只需要使用它的功能。顺便说一句,我标记的代码......很多代码......只是我的文件系统的一个简单的 MySQL 转储和 tar。不难做到!如果你认为我可以用它做意大利面,那么......
  • @sorontar 我可能必须弄清楚如何执行 script2 文件正在执行的操作并为我的原始脚本重写它。我只是想节省时间,而不是试图弄清楚 script2 的作者如何获得创建日期,然后删除早于 x 天的文件。我再次感谢您的帮助并解决了我的问题!由于至少变量正确传递,我会将您的答案标记为答案。再次感谢您!
【解决方案2】:

有时我会惊讶于自己尝试做事情的难度...s3cmd 具有按创建日期对文件进行过期功能...这会容易得多...

非常感谢所有提供帮助的人!

我不好,这应该是评论而不是答案。 :)

【讨论】:

  • 没关系,Dreamhost 似乎不支持它......回到第一方......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2020-12-21
  • 2022-01-06
  • 2018-09-23
  • 2020-06-16
  • 1970-01-01
相关资源
最近更新 更多