首页 > 解决方案 > 在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, bc每个都在不同的行上)。但是那个字符串连接仍然不起作用。$USER即使我停止在串联中使用该变量,它也不起作用。因此,如果我执行类似STR="${STR} abc"字符 abc的操作,出乎意料地没有连接到STR. 但是如果我把它放在while循环之外它实际上可以工作(所以如果我评论while循环并且简单地做STR="${STR} abc"我会进入 abc字符串STR)。我是 bash 的新手,这对我来说看起来很奇怪,不知道发生了什么/如何解决它。

标签: bashshell

解决方案


只是不要使用cat- 即。不要使用管道。并且不要使用USER.

while read var; do
        str="${str}${var}"
done < "$file"

不要在脚本中使用大写变量。USER是由 bash 设置为当前用户名的变量。

使用http://shellcheck.net检查脚本

阅读https://mywiki.wooledge.org/BashFAQ/024

阅读https://mywiki.wooledge.org/BashFAQ/001

不要无用地使用 cat

在 bash 中,您还可以使用str+="$var".

引用变量扩展。


推荐阅读