Bash
如何從 bash 的最後一個參數中刪除換行符?
我正在研究 wsl bash,我在我的
~/.bashrc
文件中定義了以下函式:function clip { /mnt/c/Windows/System32/clip.exe "${@%\n}"; }
但是,這不會
\n
從參數中刪除尾隨。我怎樣才能改進它以滿足我的特定需求?非常感謝
編輯:在Kamil的回答的幫助下,我能夠弄清楚實際發生了什麼。事實證明,生成的子程序(cmd.exe)正在添加正在插入的輸入
clip.exe
(因為我使用的是管道。例如pwd | clip
)。我能夠通過以下方式獲得所需的結果:
function clip { /mnt/c/Windows/System32/WindowsPowershell/v1.0/powershell.exe Set-Clipboard "${@:-$(cat)}"; }
它有點慢,因為它依賴於
- 電源外殼
- cat(外部二進製文件,應替換為 read builtin)
但對我的需求來說不是問題:)
"${@%\n}"
刪除尾隨n
."${@%\\n}"
將刪除尾隨\n
(文字字元串,而不是換行符)。要刪除換行符,您需要傳遞換行符。在 Bash 中,這種語法應該可以工作:
"${@%$'\n'}"
where
$'\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 行結尾的影響。檢查這個問題。