我想读取一个文件并将其保存在变量中,但是我想要保存该变量而不仅仅是打印文件。
以下为我的脚本:
#!/bin/sh
while read LINE
do
echo $LINE
done <$1
echo 11111-----------
echo $LINE
我在脚本中把文件名作为参数,如果文件名包含“aaa”的话将打印如下内容:
aaaa
11111-----
但这仅仅是将文件打印出来,我想知道它如何才能够保存在变量中。
发布于 2018-02-26 12:48:00
使用sh
:
#!/bin/sh
value=`cat config.txt`
echo "$value"
在bash
或zsh
中,将整个文件读入变量而无需调用cat
:
#!/bin/bash
value=$(<config.txt)
echo "$value"
如果要快速读取文件可以在bash
和zsh
中调用cat
,但这会让人认为cat在实际上没有起到作用。
注意,不需要引用命令替换来保留换行符。
发布于 2018-02-26 13:33:39
将整个文件读入变量中:
#!/bin/bash
value=`cat sources.xml`
echo $value
逐行阅读:
while read line; do
echo $line
done < file.txt
发布于 2018-02-26 14:18:04
其他答案忽略了以下两点:
从命令展开中删除换行符
value="$(cat config.txt)"
键入解决方案,但不是基于read
的解决方案。
在命令展开后删除末尾的换行符:
S="$(printf "a\n")"
printf "$S" | od -tx1
返回:
0000000 61
0000001
FILE="$(mktemp)"
printf "a\n\n" > "$FILE"
S="$(<"$FILE")"
printf "$S" | od -tx1
rm "$FILE"
POSIX方法:在命令展开后在末尾添加一个char,然后删除它:
S="$(cat $FILE; printf a)"
S="${S%a}"
printf "$S" | od -tx1
返回
0000000 61 0a 0a
0000003
POSIX几乎都是通过ASCII编码来解决。
去除NUL字符
举例:
printf "a\0b" | od -tx1
S="$(printf "a\0b")"
printf "$S" | od -tx1
返回:
0000000 61 00 62
0000003
0000000 61 62
0000002
解决办法:
$""
文字: S=$"a\0b" printf "$S" | od -tx1 只对文字有效但是对文件读取无效 将uuencode base64编码版本的文件存储在变量中,并在每次使用前解码:
FILE="$(mktemp)"
printf "a\0\n" > "$FILE"
S="$(uuencode -m "$FILE" /dev/stdout)"
uudecode -o /dev/stdout <(printf "$S") | od -tx1
rm "$FILE"
返回:
0000000 61 00 0a
0000003
uuencode和udecode是POSIX 7,但在Ubuntu 12.04中没有默认(sharutils
包)...除了写入另一个文件外,我没有看到bash进程<()替代扩展的POSIX 7替代方法。
我真正想说的是:如果输入文件中包含NUL字符,就不要使用Bash。
https://stackoverflow.com/questions/-100003514
复制相似问题