我想读取一个文件并将其保存在变量中,但我需要保留变量而不是打印出文件 . 我怎样才能做到这一点?我写过这个脚本,但它不是我需要的:
#!/bin/sh
while read LINE
do
echo $LINE
done <$1
echo 11111-----------
echo $LINE
在我的脚本中,我可以将文件名作为参数,因此,如果文件包含“aaaa”,例如,它会打印出来:
aaaa
11111-----
但这只是将文件打印到屏幕上,我想将其保存到变量中!是否有捷径可寻?
5 回答
这对我有用:
v=$(cat <file_path>) echo $v
如果要将整个文件读入变量:
如果你想逐行阅读:
Two important pitfalls
到目前为止被其他答案忽略了:
从命令扩展中删除换行符
NUL字符删除
Trailing newline removal from command expansion
这是一个问题:
类型解决方案,但不适用于基于
read
的解决方案 .命令扩展删除尾随换行符:
输出:
这打破了从文件中读取的天真方法:
POSIX解决方法:在命令扩展中附加一个额外的char并稍后将其删除:
输出:
几乎POSIX解决方法:ASCII编码 . 见下文 .
NUL character removal
There is no sane Bash way to store NUL characters in variables .
这会影响扩展和
read
解决方案,我不知道有什么好的解决方法 .例:
输出:
哈,我们的NUL走了!
解决方法:
ASCII编码 . 见下文 .
使用bash扩展名
$""
literals:仅适用于文字,因此对于从文件中读取无用 .
Workaround for the pitfalls
将uuencode base64编码版本的文件存储在变量中,并在每次使用前解码:
输出:
uuencode和udecode是POSIX 7但默认情况下不在Ubuntu 12.04中(
sharutils
包)...除了写入另一个文件外,我没有看到用于bash进程<()
替换扩展的POSIX 7替代方案...当然,这很慢且不方便,所以我猜真正的答案是:如果输入文件可能包含NUL字符,请不要使用Bash .
在跨平台,最低公分母
sh
您使用:在
bash
或zsh
中,将整个文件读入变量而不调用cat
:在
bash
或zsh
中调用cat
来篡改文件将被视为Useless Use of Cat .请注意,没有必要引用命令替换来保留换行符 .
见:Bash Hacker's Wiki - Command substitution - Specialities .
由于Ciro Santilli notes使用命令替换将丢弃尾随换行符 . 他们添加尾随字符的解决方法很棒,但在使用它很长一段时间之后我决定我需要一个根本不使用命令替换的解决方案 .
My approach现在使用
read
和printf
builtin的-v flag,以便将stdin的内容直接读入变量 .这支持带有或不带尾随换行符的输入 .
用法示例: