【问题标题】:Can I use a variable in a file path in bash? If so, how?我可以在 bash 的文件路径中使用变量吗?如果是这样,怎么做?
【发布时间】:2016-06-04 14:57:07
【问题描述】:

我正在尝试编写一个小的 shell 脚本来查找目录中最近添加的文件,然后将该文件移动到其他位置。如果我使用:

ls -t ~/directory | head -1

然后将它存储在变量 VARIABLE_NAME 中,为什么我不能然后通过以下方式将它移动到 ~/other 目录:

mv ~/directory/$VARIABLE_NAME ~/otherdirectory

我在这里搜索并用 Google 搜索过,但似乎没有任何关于在文件路径中使用变量的信息?有没有更好的方法来做到这一点?

编辑:这是脚本的一部分:

ls -t ~/downloads | head -1
read diags
mv ~/downloads/$diags ~/desktop/testfolder

【问题讨论】:

  • 是的,您可以在路径中使用变量。这不一定是您遇到的问题。您可能会遇到一些问题,例如 ~ 的扩展。或者您可能对包含空格的文件名和目录名有疑问。我不是读心术,所以我不一定知道你在尝试时遇到了什么错误。
  • $VARIABLE_NAME 包含什么?
  • 我已经用处理存储/移动变量的脚本部分更新了帖子。
  • 脚本部分不够充分,因为它没有显示 VARIABLE_NAME 如何接收其值。此外,如果您描述观察到的效果会很有帮助:您是否收到错误消息,或者文件是否显示在不同的位置?
  • 脚本的第一部分(未发布)在 /desktop 中创建了几个目录并且运行良好。当我到达要移动文件的地步时,脚本似乎只是挂起,实际上什么也没发生。

标签: bash filepath


【解决方案1】:

您可以在脚本中执行以下操作:

diags=$(ls -t ~/downloads | head -1)
mv ~/downloads/"$diags" ~/desktop/testfolder

在这种情况下,diags 被赋值为ls -t ~/downloads | head -1,可以由mv 调用。

【讨论】:

  • 嘿,谢谢你;在我弄清楚子shell问题之后,最终成为处理这个问题的正确方法。
【解决方案2】:

以下命令

ls -t ~/downloads | head -1
read diags

可能不是您想要的:读取命令之前没有从该命令接收其输入。相反,它等待来自标准输入的输入,这就是您认为脚本“挂起”的原因。也许您想执行以下操作(至少这是我第一次错误地尝试提供更好的解决方案):

ls -t ~/downloads | head -1 | read diags

但是,这也不起作用(正如 alvits 所提到的),因为管道的每个元素都作为单独的命令运行:因此变量 diags 不是父 shell 的一部分,而是子进程的一部分。

因此,正确的解决方案是:

diags=$(ls -t ~/downloads | head -1)

不过,还有一些问题可能会导致后续的 mv 命令失败:

  • 目录可能为空。
  • 文件名可能包含空格、换行符等。

【讨论】:

  • 这个管道有帮助,但我现在似乎已经将整个下载目录转移到了测试文件夹中。看起来 $diags 被 mv 命令忽略了。
  • 尝试在调试模式下运行 bash,即使用 bash -x。您也可以将 -x 放在 shebang 行中:#/bin/bash -x
  • @TheVideotapes - 这是在子外壳或管道中使用变量的一个众所周知的问题。局部变量$diags 被分配了ls -t ~/downloads | head -1 的输出,但是在执行该行之后它丢失了。你应该使用printf -v diag '%s' $(ls -t ~/downloads | head -1)
  • @alvits - 哎呀,你当然是对的,将解决这部分答案。
  • 谢谢你们!一位朋友向我展示了shellcheck.net,它立即看到了 subshel​​l 问题,所以我能够解决这个问题。我最终得到了diags=$(ls -t ~/downloads | head -1),这在mv -v ~/downloads/"$diags" ~/desktop/testfolder中得到了尊重
猜你喜欢
  • 2011-04-22
  • 2011-01-21
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2021-06-30
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多