bash - 在bash中的while循环内连接字符串
问题描述
我正在尝试在 bash 中编写一个程序,该程序将文件名作为输入参数,然后获取该文件的每一行并将其附加到字符串中。最后,我想打印这个字符串。这是我写的(考虑程序名称是concat.sh
):
#!/bin/bash
FILE=$1
STR=""
cat $FILE | while read USER; do
STR="${STR}${USER}"
done
echo "$STR"
我有文件stuff.txt
,其中包含以下内容:
a
b
c
在我运行之后,./concat.sh stuff.txt
我得到了空字符串。我尝试了该连接的多种变体,有空格,没有空格(如上),有换行符等。仍然不起作用。如果我尝试简单地打印每一行,它就可以工作。因此,如果我只是echo "$USER"
在循环中添加该行,我会得到正确的输出,即 , a
, b
(c
每个都在不同的行上)。但是那个字符串连接仍然不起作用。$USER
即使我停止在串联中使用该变量,它也不起作用。因此,如果我执行类似STR="${STR} abc"
字符 abc
的操作,出乎意料地没有连接到STR
. 但是如果我把它放在while循环之外它实际上可以工作(所以如果我评论while循环并且简单地做STR="${STR} abc"
我会进入 abc
字符串STR
)。我是 bash 的新手,这对我来说看起来很奇怪,不知道发生了什么/如何解决它。
解决方案
只是不要使用cat
- 即。不要使用管道。并且不要使用USER
.
while read var; do
str="${str}${var}"
done < "$file"
不要在脚本中使用大写变量。USER
是由 bash 设置为当前用户名的变量。
阅读https://mywiki.wooledge.org/BashFAQ/024
阅读https://mywiki.wooledge.org/BashFAQ/001
在 bash 中,您还可以使用str+="$var"
.
引用变量扩展。
推荐阅读
- reactjs - ReactJS:将事件侦听器添加到 HTML 正文元素并在这些侦听器中使用组件的状态
- reactjs - React - 如何将 node_modules 样式导入组件以在本地设置样式
- java - 如何使用流代替循环并从中受益
- r - 为什么我不能更改 RStudio 中的工作目录?
- php - html表单不向php发送值
- python - sys.getrefcount() 打印的对象引用数比预期的多一个?
- javascript - JQuery 使用输入文本预选下拉框
- python-3.x - 对 AWS DynamoDB 的 Moto 模拟调用返回 Vague Region KeyError
- tensorflow - 使用 StandardScalar 而不是 MinMax 时获取 nan 作为损失函数
- flask - 无法为交换“reply.celery.pidbox”路由消息:表为空或键不再存在