【问题标题】:Bash parsing ls lessons learned using printf and nul delimiterBash 解析 ls 使用 printf 和 nul 分隔符的经验教训
【发布时间】:2020-03-16 16:51:23
【问题描述】:

由于缺少分隔空字符,我已阅读有关the downfalls of parsing ls、printf、echo 和其他的信息。

I asked a question about using functions 来解决这个问题,答案似乎正确地指出,因为我使用的是基本回声,所以会发生同样的问题。

但是,我最近读到 it is possible to output a null delimited character using printf(我会假设 echo -e)。

当然,for 循环提供了最大的灵活性,但是 printf 和 它对参数的隐式循环可以涵盖许多更简单的 案例。它甚至可以生成 NUL 分隔的流,非常适合以后使用 检索:

$ printf "%s\0" "${myarray[@]}" > myfile

如果这确实有效,它是否仅限于某些版本的 printf 或 bash,我可以重写我的 original questions 函数来使用

printf "%s\0" "$i"

而不是

echo "$i"

或者我可以使用以下内容吗?

echo -e "$i\0"

【问题讨论】:

  • 想想i='\n'时会发生什么
  • printf '%s\0' "$i" 很好,实际上比 echo -e 更可取,因为它可以跨 POSIX 兼容的 shell 移植,而 echo -e 是一个 bash 扩展,用于将 POSIX 指定的行为恢复为 @987654333 @ 首先。
  • KamilCuk 有一个观点。当i='\n' 时,echo 将打印换行符,但 printf 将打印\n。顺便说一句,在像for f in glob 这样的循环中过滤一些文件时使用数组更明智
  • 你们中的某个人是否想将这些有用但短暂的 cmets 变成有用且永久的答案?或者找一个副本...

标签: bash


【解决方案1】:

这适用于任何与 Posix 兼容的 shell:

printf "%s\0" "$i"

不要使用echo -e。首先,它是非标准的,在许多系统上它不会工作,或者更糟糕的是偶尔会工作。其次,它会修改在$i 中找到的任何反斜杠,而重点是将$i 原封不动地传递出去。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多