首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将文件读入shell中的变量?

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

Stack Overflow用户
提问于 2018-02-26 05:12:51
回答 3查看 0关注 0票数 0

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

以下为我的脚本:

代码语言:javascript
运行
复制
#!/bin/sh
while read LINE  
do  
  echo $LINE  
done <$1  
echo 11111-----------  
echo $LINE  

我在脚本中把文件名作为参数,如果文件名包含“aaa”的话将打印如下内容:

代码语言:javascript
运行
复制
aaaa
11111-----

但这仅仅是将文件打印出来,我想知道它如何才能够保存在变量中。

EN

回答 3

Stack Overflow用户

发布于 2018-02-26 12:48:00

使用sh:

代码语言:javascript
运行
复制
#!/bin/sh
value=`cat config.txt`
echo "$value"

bashzsh中,将整个文件读入变量而无需调用cat:

代码语言:javascript
运行
复制
#!/bin/bash
value=$(<config.txt)
echo "$value"

如果要快速读取文件可以在bashzsh中调用cat,但这会让人认为cat在实际上没有起到作用

注意,不需要引用命令替换来保留换行符。

Bash Hacker的Wiki-Command substitution-Specialities...

票数 0
EN

Stack Overflow用户

发布于 2018-02-26 13:33:39

将整个文件读入变量中:

代码语言:javascript
运行
复制
#!/bin/bash
value=`cat sources.xml`
echo $value

逐行阅读:

代码语言:javascript
运行
复制
while read line; do    
    echo $line    
done < file.txt
票数 0
EN

Stack Overflow用户

发布于 2018-02-26 14:18:04

其他答案忽略了以下两点:

  1. 从命令展开中删除换行符
  2. 去除NUL字符

从命令展开中删除换行符

代码语言:javascript
运行
复制
value="$(cat config.txt)"

键入解决方案,但不是基于read的解决方案。

在命令展开后删除末尾的换行符:

代码语言:javascript
运行
复制
S="$(printf "a\n")"
printf "$S" | od -tx1

返回:

代码语言:javascript
运行
复制
0000000 61
0000001
代码语言:javascript
运行
复制
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"

POSIX方法:在命令展开后在末尾添加一个char,然后删除它:

代码语言:javascript
运行
复制
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1

返回

代码语言:javascript
运行
复制
0000000 61 0a 0a
0000003

POSIX几乎都是通过ASCII编码来解决。

去除NUL字符

在变量中不使用bash方法来存储NUL字符

举例:

代码语言:javascript
运行
复制
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1

返回:

代码语言:javascript
运行
复制
0000000 61 00 62
0000003

0000000 61 62
0000002

解决办法:

  • ASCII编码。见下文。
  • 使用bash扩展$""文字: S=$"a\0b" printf "$S" | od -tx1 只对文字有效但是对文件读取无效

将uuencode base64编码版本的文件存储在变量中,并在每次使用前解码:

代码语言:javascript
运行
复制
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"

返回:

代码语言:javascript
运行
复制
0000000 61 00 0a
0000003

uuencode和udecode是POSIX 7,但在Ubuntu 12.04中没有默认(sharutils包)...除了写入另一个文件外,我没有看到bash进程<()替代扩展的POSIX 7替代方法。

我真正想说的是:如果输入文件中包含NUL字符,就不要使用Bash。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档