【问题标题】:Tilde (~/) not working on if then statement in Shell script [duplicate]波浪号(〜/)不适用于Shell脚本中的if then语句[重复]
【发布时间】:2015-01-30 01:18:32
【问题描述】:

我有以下脚本

file=${file:-letsdump.sh}    
checkfile="~/mysql_backup/$file"
if [ -e "$checkfile" ]; then
mv ~/mysql_backup/$file ~/mysql_backup/$file-bak-$(date +%d%m%Y_%H%M).bak
else
echo 'file doesnt exist'   
fi

我知道我的文件在那里,我认为这可能与 ~/ 有关?

它永远找不到文件

【问题讨论】:

  • 在引号内,~ 没有展开。
  • 顺便说一句,这是一个常见问题解答。

标签: shell file home-directory tilde-expansion


【解决方案1】:

双引号(实际上是任何引号)防止 ~ 被扩展。改为使用:

checkfile=~/mysql_backup/"$file"

...或者,更好的是,在所有脚本中使用$HOME,并将~ 视为仅供交互/人类使用的工具。

【讨论】:

  • 是的!家庭工作完美!
【解决方案2】:

~ 字符未在双引号字符串内展开。

在这种情况下,~ 等价于$HOME 扩展为双引号字符串,因此您可以这样写:

checkfile="$HOME/mysql_backup/$file"

当后跟用户名时,~ 指的是该用户的主目录,不被任何环境变量跟踪; "~fred/" 不会扩展,但是在这种情况下编写可以正确扩展的东西更加困难。 你可以把它放在引号之外,但是如果主目录路径包含一个空格,这可能会导致问题——我希望这永远不会发生。 更正,感谢 Charles Duffy:字符串拆分在作业中被禁用,所以这不是问题。

【讨论】:

  • 由于在分配时禁用了字符串拆分,因此即使是空格在主目录中的情况也可以与手头上下文中未引用的扩展一起正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2021-10-15
相关资源
最近更新 更多