gpt4 book ai didi

bash - 如何确保 bash 中一致的换行处理

转载 作者:行者123 更新时间:2023-11-29 09:48:40 25 4
gpt4 key购买 nike

我有一个简单的脚本,它使用 curl 获取一些纯文本文件,并将其分配给变量;稍后它回显它并用 greps 查找一些行,将它们放入一个临时文件中(我实际上想将它们放入一个数组中);然后遍历它们并做一些事情。我在 Mac OS X 上的一台机器上运行它,它基本上可以工作。但是,随机会发生以下任一情况:

  • curl 输出被视为单行,因此在 echo/grep 阶段,事情中断了;
  • 在执行 echo 和 for 循环时,整个 tmp 文件被视为单行(我似乎已经使用“读取行”减轻了这种情况),所以它再次中断。

有什么方法可以确保换行符得到一致、一劳永逸的处理?我什至不在乎,只要它始终相同,如果需要,我也可以从单行 curl 输出中提取结果。

更新:来自不同的地方。登录到机器上,做了一些事情,发现脚本不起作用。运行一些命令(结果,删节,下面)进行测试,注销,重新登录,行为改变(回到预期的)。请注意 for 循环输出之间的区别...对于我来说,curl 输出也会发生同样的情况,其中完全相同的命令(据我所知)完全相同的 env 以不同方式处理换行符。我想要做的是在每个脚本的开头运行一些命令,使其 100% 确定行为永远不会改变。

[root@ip-xxx-xxx-xxx-xxx ~]# cat example.txt 
ip-xxx-xxx-xxx-xxx.ec2.internal
ip-xxx-xxx-xxx-xxx.ec2.internal
[root@ip-xxx-xxx-xxx-xxx ~]# for f in `cat example.txt`; do echo "line $f"; done
line ip-xxx-xxx-xxx-xxx.ec2.internal
ip-xxx-xxx-xxx-xxx.ec2.internal
[root@ip-xxx-xxx-xxx-xxx ~]# while read f; do echo "line $f"; done < "example.txt"
line ip-xxx-xxx-xxx-xxx.ec2.internal
line ip-xxx-xxx-xxx-xxx.ec2.internal
[root@ip-xxx-xxx-xxx-xxx ~]# logout
Connection to ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com closed.
reznor-mbp:trunk2 sergey$ ssh -i ... "root@..."
Last login: ...
[root@ip-xxx-xxx-xxx-xxx ~]# for f in `cat example.txt`; do echo "line $f"; done
line ip-xxx-xxx-xxx-xxx.ec2.internal
line ip-xxx-xxx-xxx-xxx.ec2.internal

最佳答案

第一:不要用 for; 读行;使用 while read 循环读取它们:

while read -r; do
echo "line $REPLY"
done <example.txt

for f in $(cat example.txt) 的问题是 cat 操作的输出在进入循环之前经过字符串拆分和 glob 扩展,使得行为依赖于 a变量的数量(IFS shell 设置的内容,当前目录中的文件 [如果存在潜在的 glob 扩展名称],影响 glob 解释方式的各种 shell 选项,等等)。 while read 方法的行为将保持一致。

其次——总是出于同样的原因引用扩展:"$line" 避免字符串拆分和 glob 扩展(同样,使上述设置和变量没有实际意义),而裸 $行 有那些发生。

最后,上面的示例使用默认的 REPLY 变量,因为 shell 在这些条件下读取时不会修剪空白字符(即,在 $IFS 中找到的字符) .这通常是不必要的(并且通过显式清除 IFS 可以产生相同的效果,如 while IFS= read -r line; do ...),但由于目标是可重现的,我们做对了。 :)

遵循这些实践,您将看到所有符合 POSIX sh 的 shell 之间的一致行为。 (唯一不符合 POSIX sh 的主要 shell —— 在它认为标准强制行为不合理的地方默认破坏兼容性 —— 是 zsh)。

关于bash - 如何确保 bash 中一致的换行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com