【问题标题】:SH script - passed variable (file name) with spaceSH 脚本 - 使用空格传递变量(文件名)
【发布时间】:2014-05-23 13:25:43
【问题描述】:

老实说,我对自己有点失望,但我花了几个小时试图成功地搜索到这个。该主题已在多个主题中讨论,但我无法找到解决方案。

我有一个“sh”脚本(在busybox上或者我会使用完整的bash)。

脚本被外部调用并传递了 3 个变量($1、$2、$3),其中:

$1 directory of file
$2 not used
$3 name of file including directory

我正在尝试获取文件大小(stat 不可用)所以我正在尝试使用 du:

伪:

filesize=$(du $3 | awk '{ print $1 }')

我只是无法让脚本正确处理带有空格的文件名。 我试过引用和逃避引用无济于事。 在命令提示符下,我可以注入 \ 来处理 du 的空白。

感谢您的帮助。

【问题讨论】:

  • 如何调用脚本?
  • du "$3" 应该可以工作。
  • 脚本是 chmod a+x 并且被称为“sh script”和./script。
  • 这里所有知识渊博的海报似乎都同意双引号应该有效。你声称它没有。唯一合理的结论是你没有很好地解释你到底在做什么是行不通的。您删除的重要细节:您正在运行的代码(演示问题的最小工作示例),您如何运行它(完整的命令行),以及您获得的结果/错误消息。如果你这样做,我保证你会找到解决问题的方法,而不是继续这个无休止的“这应该工作”/“它不”循环。
  • 扩展@shx2 的评论:可能涉及另一个问题,例如脚本调用错误(例如,文件名在传递给脚本时没有正确引用,这意味着它的一部分在 $3 , 4 美元的一部分, 5 美元、6 美元等的一部分) set -x 对于弄清楚脚本中发生的事情非常有用。另外,尝试通过shellcheck.net 运行脚本,看看它是否发现任何明显的东西。

标签: bash shell awk sh


【解决方案1】:

双引作品为sh

sh-3.2$ f="a b"
sh-3.2$ echo aaaa > "$f"
sh-3.2$ ls -l "a b"
-rw-r--r--  1 xxxx  xxxxx  5 May 23 xx:xx a b
sh-3.2$ du "$f"
8   a b

【讨论】:

  • 从脚本中调用 'du"$f"' 是问题所在,du"$f" 不起作用(与上面的 du"$3" 相同)
【解决方案2】:

试试

    filesize=`du "$3" | awk '{ print $1 }'`

【讨论】:

  • 你为什么要从$()切换到反引号?!
  • 结果相同,找不到文件
  • $() 在 sh 中对我不起作用。再次阅读原始问题.. Busybox 似乎正在使用 ash 所以它应该支持 $()。在 bash.. $() 为我工作。脚本是这样调用的。 script dir arg2 "dir with space"
【解决方案3】:

我非常感谢那些花时间就这个问题提供一些想法的人。经过长时间的努力,最终确定busybox实现是罪魁祸首。

上面提供的所有内容都是有效的,前提是使用了更新版本的 bb(或任何完整发行版)。不幸的是,需要大量的试验和错误才能找到原因。

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2020-09-18
    • 2020-11-02
    • 2016-04-18
    相关资源
    最近更新 更多