如何从 bash 中的最后一个参数中删除换行符?

如何从 bash 中的最后一个参数中删除换行符?

我正在使用 wsl bash,并且在我的~/.bashrc文件中定义了以下函数:

function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }

\n然而,这并没有从参数中删除尾随。我该如何改进以满足我的特定需求?

非常感谢

编辑:在帮助下卡米尔的答案,我能够弄清楚到底发生了什么。事实证明,生成的子进程(cmd.exe)正在添加正在插入的回车符clip.exe(因为我正在使用 Pipes.ex. pwd | clip)。

我能够通过以下方式获得所需的结果:

function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }

它有点慢,因为它依赖于

  • 电源外壳
  • cat(外部二进制文件应替换为 read 内置文件)

但对于我的需求来说这不是问题:)

答案1

"${@%\n}"删除尾随n."${@%\\n}"将删除尾随\n(文字字符串,而不是换行符)。

要删除换行符,您需要传递换行符。在 Bash 中,这个语法应该有效:

"${@%$'\n'}"

在哪里$'\n'负责生成实际的换行符。字面换行符也可以工作:

"${@%
}"

笔记:

  • 该解决方案从每个参数中删除尾随换行符,而不仅仅是最后一个参数(因为这就是$@工作原理)。
  • 在 Linux 中,命令行参数中尾随换行符是不常见的。我不了解WSL,不知道你的使用场景;我希望你知道你想要什么*

例子:

$ set a $'b\n' c
$ printf '<%s>\n' "$@"
<a>
<b
>
<c>
$ printf '<%s>\n' "${@%$'\n'}"
<a>
<b>
<c>
$ printf '<%s>\n' "${@%
}"
<a>
<b>
<c>


\n* 如果“从参数中删除尾随”不是你想要的,那么或许您在(来源?)脚本中调用该函数,并且该脚本受到 DOS 行结尾的影响。查看这个问题

相关内容