相关疑难解决方法(0)

如何在bash脚本中将换行符添加到变量中

当我做

str="Hello World\n===========\n"
Run Code Online (Sandbox Code Playgroud)

\n也打印出来了 那我怎么会有换行符呢?

bash quoting

103
推荐指数
6
解决办法
17万
查看次数

为什么使用命令替换时换行符会丢失?

我有一个名为 links.txt 的文本文件,它看起来像这样

link1
link2
link3
Run Code Online (Sandbox Code Playgroud)

我想逐行遍历这个文件并对每一行执行一个操作。我知道我可以使用 while 循环来做到这一点,但由于我正在学习,我想使用 for 循环。我实际上使用了这样的命令替换

a=$(cat links.txt)
Run Code Online (Sandbox Code Playgroud)

然后像这样使用循环

for i in $a; do ###something###;done
Run Code Online (Sandbox Code Playgroud)

我也可以做这样的事情

for i in $(cat links.txt); do ###something###; done
Run Code Online (Sandbox Code Playgroud)

现在我的问题是当我在变量 a 中替换 cat 命令输出时,link1 link2 和 link3 之间的换行符被删除并被空格替换

echo $a
Run Code Online (Sandbox Code Playgroud)

产出

链接1 链接2 链接3

然后我使用了 for 循环。当我们执行命令替换时,是否总是用空格替换新行?

问候

shell command-substitution newlines

48
推荐指数
3
解决办法
10万
查看次数

我的命令替换中的尾随换行符在哪里?

下面的代码最好地描述了这种情况。为什么最后一行不输出尾随换行符?每行的输出都显示在注释中。我使用的是GNU bash,版本 4.1.5

     echo -n $'a\nb\n'                  | xxd -p  # 610a620a  
           x=$'a\nb\n'   ; echo -n "$x" | xxd -p  # 610a620a
     echo -ne "a\nb\n"                  | xxd -p  # 610a620a
x="$(echo -ne "a\nb\n")" ; echo -n "$x" | xxd -p  # 610a62
Run Code Online (Sandbox Code Playgroud)

command-line shell text-processing command-substitution

15
推荐指数
2
解决办法
3379
查看次数

echo -e 的反义词是什么?

如果我有一个包含不可打印字符、换行符或制表符的字符串,有没有办法echo打印这个字符串并显示这些字符的代码(例如,\n换行符、\b退格符)?

shell echo

13
推荐指数
3
解决办法
2300
查看次数

打印包含换行符的变量时,为什么最后一个换行符被删除?

file.txt 的内容(不奇怪,POSIX 定义的文本文件)

iguana
gecko
anole
Run Code Online (Sandbox Code Playgroud)

示例脚本:

#!/bin/sh

string="$(cat file.txt)"

printf '%s' "$string"
Run Code Online (Sandbox Code Playgroud)

示例输出:

[coolguy@somemachine ~]$ ./script.sh
iguana
gecko
anole[coolguy@somemachine ~]$
Run Code Online (Sandbox Code Playgroud)

最后一个换行符发生了什么?为什么除了最后一个都保留了换行符?如果已经有一个换行符,我们似乎不必使用 echo 添加一个换行符。

shell command-substitution newlines

9
推荐指数
1
解决办法
1321
查看次数

防止命令替换删除尾随换行符的优雅方法

我正在自定义我的 zshPROMPT并调用一个函数,该函数可能是也可能不是echo基于环境变量状态的字符串:

function my_info {
    [[ -n "$ENV_VAR"]] && echo "Some useful information\n"
}

local my_info='$(my_info)'

PROMPT="${my_info}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)

我希望信息以尾随换行符结尾,这样如果设置了它,它就会出现在自己的行上:

Some useful information
My awesome prompt $>
Run Code Online (Sandbox Code Playgroud)

但是,如果未设置,我希望提示在一行上,避免提示中由无条件换行引起的空行:

PROMPT="${my_info}  # <= Don't want that :)
My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)

目前,我$(command substitution)通过使用非打印字符作为后缀来解决删除换行符的问题,因此换行符不再尾随:

[[ -n "$ENV_VAR"]] && echo "Some useful information\n\r"
Run Code Online (Sandbox Code Playgroud)

这显然是一个黑客。有没有一种干净的方法来返回以换行符结尾的字符串?

编辑:我明白是什么导致了尾随换行符丢失以及为什么会发生这种情况,但在这个问题中,我特别想知道如何防止这种行为(我认为这种解决方法不适用于我的情况,因为我是寻找“条件”换行符)。

编辑:我更正了:引用的解决方法实际上可能是一个相当不错的解决方案(因为比较中的前缀字符串是一种常见且有些相似的模式),但我无法使其正常工作:

echo "Some useful information\n"x
  [...]
PROMPT="${my_info%x}My awesome prompt $>"
Run Code Online (Sandbox Code Playgroud)

不会x …

prompt zsh function command-substitution newlines

7
推荐指数
1
解决办法
1302
查看次数

如何将整个 stdin 逐字转换为命令行参数?

尝试 1

xargs -I '{}' -0 -n 1 myprogram --arg '{}' --other-options
Run Code Online (Sandbox Code Playgroud)

但这不会保留零字节。此外,该程序可能会运行多次。但是,它不会在零字节进入标准输入的情况下失败,而是多次运行程序。

尝试 2

myprogram --arg "`cat`" --other-options
Run Code Online (Sandbox Code Playgroud)

但这不会保留尾随空格。

尝试 3

bash -c 'read -r -d "" INPUT ; myprogram --arg "$INPUT" --other-options'
Run Code Online (Sandbox Code Playgroud)

似乎与终端混淆,也无法保留尾随空格。


我如何正确,可靠,可读,兼容地做到这一点?

command-line bash shell-script stdin

2
推荐指数
1
解决办法
1632
查看次数

从文本文件中读取并一次一个字符地打印单词

我想编写一个程序,该程序从文本文件中读取并Terminal每隔一秒逐个字符地打印该文件的单词。

例如,在一个文本文件中,log.txt假设我有这句话:

I love Unix but I don't know programming.
Run Code Online (Sandbox Code Playgroud)

我想让代码读取上一句并每秒一个一个地打印字母,空格。

shell text-processing

2
推荐指数
1
解决办法
1772
查看次数