我正在尝试用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"
,我将在字符串STR
中得到abc
)。我是bash的新手,这对我来说看起来真的很奇怪,不知道发生了什么/如何修复它。
1条答案
按热度按时间5f0d552i1#
不要使用
cat
- ie。不要使用管道。不要使用USER
。不要在脚本中使用大写变量。
USER
是bash设置的当前用户名变量。使用http://shellcheck.net检查脚本
读取https://mywiki.wooledge.org/BashFAQ/024
读取https://mywiki.wooledge.org/BashFAQ/001
Do not uselessly use cat。
在bash中,你也可以使用
str+="$var"
。引用变量扩展。