我有一个名为 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 循环。当我们执行命令替换时,是否总是用空格替换新行?
问候
下面的代码最好地描述了这种情况。为什么最后一行不输出尾随换行符?每行的输出都显示在注释中。我使用的是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) 如果我有一个包含不可打印字符、换行符或制表符的字符串,有没有办法echo打印这个字符串并显示这些字符的代码(例如,\n换行符、\b退格符)?
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 添加一个换行符。
我正在自定义我的 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 …
xargs -I '{}' -0 -n 1 myprogram --arg '{}' --other-options
Run Code Online (Sandbox Code Playgroud)
但这不会保留零字节。此外,该程序可能会运行多次。但是,它不会在零字节进入标准输入的情况下失败,而是多次运行程序。
myprogram --arg "`cat`" --other-options
Run Code Online (Sandbox Code Playgroud)
但这不会保留尾随空格。
bash -c 'read -r -d "" INPUT ; myprogram --arg "$INPUT" --other-options'
Run Code Online (Sandbox Code Playgroud)
似乎与终端混淆,也无法保留尾随空格。
我如何正确,可靠,可读,兼容地做到这一点?
我想编写一个程序,该程序从文本文件中读取并Terminal每隔一秒逐个字符地打印该文件的单词。
例如,在一个文本文件中,log.txt假设我有这句话:
I love Unix but I don't know programming.
Run Code Online (Sandbox Code Playgroud)
我想让代码读取上一句并每秒一个一个地打印字母,空格。