如何在shell中将文件读入变量中?

26 浏览
0 Comments

如何在shell中将文件读入变量中?

我想读取一个文件并将其保存在一个变量中,但我需要保留这个变量而不仅仅是将文件打印出来。

我应该如何做?我写了这个脚本,但它并不完全符合我的需求:

#!/bin/sh
while read LINE  
do  
  echo $LINE  
done <$1  
echo 11111-----------  
echo $LINE  

在我的脚本中,我可以将文件名作为参数传递,所以如果文件中包含"aaaa",例如,它会打印出:

aaaa

11111-----

但这只是将文件打印到屏幕上,我想将其保存到一个变量中!

有没有简便的方法可以做到这一点?

0
0 Comments

如何在shell中将文件读入变量中?

在其他回答中忽略的两个重要陷阱:

1. 命令扩展中的尾随换行符删除

2. NUL字符的删除

命令扩展会删除尾随换行符,这对于基于“value="$(cat config.txt)"”类型的解决方案是一个问题,但对于基于“read”的解决方案则不是。

命令扩展会删除尾随换行符,这会破坏从文件中读取的简单方法。

解决方法:

添加一个额外的字符到命令扩展中,然后稍后将其删除。

NUL字符的删除也是一个问题,无法在变量中存储NUL字符。没有明智的Bash方法来存储NUL字符,这会影响扩展和“read”解决方案。

解决方法:

1. ASCII编码。

2. 使用Bash扩展的$""文字。

3. 存储文件的uuencode base64编码版本,并在每次使用之前进行解码。

这种解决方法是慢而不方便的,所以最好的方式是如果输入文件可能包含NUL字符,则不要使用Bash。

读取文件到变量的过程中需要注意尾随换行符的删除和NUL字符的删除。可以通过添加额外字符或进行编码解码来解决这些问题。然而,对于可能包含NUL字符的输入文件,最好不要使用Bash。

0
0 Comments

在Shell中,有时候需要将文件的内容读取到一个变量中。这样可以方便地对文件内容进行处理或者在其他地方使用。下面将介绍如何读取文件内容到变量中的方法。

首先,如果你想将整个文件的内容读取到一个变量中,可以使用以下代码:

#!/bin/bash
value=`cat sources.xml`
echo $value

以上代码中,使用了`cat`命令将`sources.xml`文件的内容读取到了变量`value`中,并通过`echo`命令打印出来。

其次,如果你想逐行读取文件内容,则可以使用以下代码:

while read line; do    
    echo $line    
done < file.txt

以上代码中,使用了`while read`循环结构,每次读取一行内容到变量`line`中,并通过`echo`命令打印出来。`<`符号用于从文件`file.txt`中读取内容。

然后,如果文件中包含反斜杠、双引号或者引号等特殊字符,需要注意一些细节。在上述代码中,为了避免Shell对变量进行空格分割和通配符扩展,需要使用双引号将变量引起来,如`echo "$value"`。

此外,建议在使用`read`命令时,使用`read -r`代替`read`,除非你特别需要使用旧版本的`read`命令的奇怪行为。

通过以上介绍,你现在应该知道如何将文件内容读取到变量中了。无论是将整个文件内容读取到一个变量中,还是逐行读取文件内容,都可以通过简单的Shell代码实现。通过这些方法,你可以方便地对文件内容进行处理或者在其他地方使用。

0
0 Comments

在Shell中如何将文件读入变量?

在跨平台、最低公共分母的Shell(sh)中,可以使用以下代码将文件读入变量:

#!/bin/sh
value=`cat config.txt`
echo "$value"

在Bash或Zsh中,可以使用以下代码将整个文件读入变量而不使用cat命令:

#!/bin/bash
value=$(

在Bash或Zsh中使用cat命令来读取文件会被认为是无用的用法(Useless Use of Cat)。

需要注意的是,不需要对命令替换进行引号处理以保留换行符。

但这只适用于Bash,而不是Sh;这让我困扰了很久,因为我重新开始使用FreeBSD时要记住纯/bin/sh的限制。

如果config.txt包含空格,使用`value="`cat config.txt`"`和`value="$(

关于换行符,不需要使用双引号来保留最后一个非空行前面的换行符。尾随的换行符会被删除。一些人建议使用的双引号并不改变这一点。其他回答中提到了如何保留尾随换行符的问题。我考虑过修改我的答案来包含这一点,但感觉自己在窃取别人的答案。

需要注意的是,上述使用cat的方法并不总是被认为是无用的用法。例如,`/dev/null`会导致无法将错误消息路由到/dev/null,而`cat invalid-file 2>/dev/null`可以正确地路由到/dev/null。

对于像我这样的新shell脚本编写者,请注意使用反引号(back ticks)而不是单引号!希望这能帮助某人节省我花了半个小时才弄明白的时间。

对于像我这样的新手,请注意`value=$(

使用`{ var=$(<"file"); } 2>/dev/null`来禁用警告,请参考https://unix.stackexchange.com/questions/428500/how-to-make-bash-substitution-filename-silent/428529#428529

反引号作为“最低公共分母”适用于几十年前的Shell。我认为在任何作为`/bin/sh`运行的Shell中,使用`$(...)`都可以正常工作。

你也可以使用`value = $(cat /etc/filename)`。

`$`符号会被替换为一个目录列表。

`value=`cat config.txt``比`value="$(cat config.txt)"`好吗?如果是的话,为什么?能否在你的答案中解释一下?我不理解在Bash中如何使用反引号,以前从未使用过。

不,使用反引号不好。相反,它更糟糕,即使你添加了缺失的引号,因为它可能会将反引号与撇号混淆,并且无法轻松地嵌套替换,例如`$(cat /path/to/$(printf %03x.txt $myNum))`。

另一方面,在AzureDevOps pipeline中编写Bash任务时,`$(....)`也可以表示ADO变量替换,这种情况下使用反引号可能更可取。

不,因为不会执行任何的分词。引用了`man bash`中的SIMPLE COMMAND EXPANSION部分:“变量赋值中等号后面的文本将在赋值之前经历波浪线展开、参数扩展、命令替换、算术扩展和引号删除。”双引号会像往常一样被删除,但它们不会产生任何影响。

0