shellscript 中操作多行字符串变量
当我们在 shell 的 bash 里操作多行内容的字符串,我们往往会想到普通的字符串处理办法 例如:
1
2
string="Hello linux"
echo $string
其实 bash 提供了一个非常好的解决办法,就是 “Multi-line”
变量注入
e.g. 包含变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cat > myfile.txt <<EOF
this file has $variable $names $inside
EOF
# 注入文档到 myfile.txt
cat myfile.txt
#输入:
#this file has
variable="ONE"
names="TWO"
inside="expanded variables"
cat > myfile.txt <<EOF
this file has $variable $names $inside
EOF
#print out the content of myfile.txt
cat myfile.txt
#输入:
#this file has ONE TWO expanded variables
不注入变量值
PS: 引用符号 “EOF” 决定是否需要输入变量
1
2
3
4
5
6
7
cat > myfile.txt <<"EOF"
this file has $variable $dollar $name $inside
EOF
cat myfile.txt
#得到
#this file has $variable $dollar $name $inside
转义 dollar “$” 符号,bash将取消变量的解析
1
2
3
4
5
6
7
cat > myfile.txt <<EOF
this file has $variable \$dollar \$name \$inside
EOF
cat myfile.txt
# 得到
# this file has $variable $dollar $name $inside
将多行文本赋值到变量
例1: 变量注入
1
2
3
4
5
6
7
8
read -d '' stringvar <<-"_EOF_"
all the leading dollars in the $variable $name are $retained
_EOF_
# 输入变量
echo $stringvar;
# all the leading dollars in the $variable $name are $retained
例2:直接定义,换行符被删除,引号含义变化
1
2
3
4
5
6
7
8
9
VARIABLE1="<?xml version="1.0" encoding='UTF-8'?>
<report>
<img src="a-vs-b.jpg"/>
<caption>Thus is a future post on Multi Line Strings in bash
<date>1511</date>-<date>1512</date>.</caption>
</report>"
echo $VARIABLE1
# <?xml version=1.0 encoding='UTF-8'?> <report> <img src=a-vs-b.jpg/> <caption>Thus is a future post on Multi Line Strings in bash <date>1511</date>-<date>1512</date>.</caption> </report>
注意: 定义变量的时候,version 后面的 1.0 是有引号的,输出后,引号没了
例3:使用cat 原样保留了原定义的数据
1
2
3
4
5
6
7
8
9
10
11
VARIABLE2=$(cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<report>
<img src="a-vs-b.jpg"/>
<caption>Thus is a future post on Multi Line Strings in bash
<date>1511</date>-<date>1512</date>.</caption>
</report>
EOF
)
echo $VARIABLE2
#<?xml version="1.0" encoding='UTF-8'?> <report> <img src="a-vs-b.jpg"/> <caption>Thus is a future post on Multi Line Strings in bash <date>1511</date>-<date>1512</date>.</caption> </report>
同上,输出内容与原定义内容相同
1
2
3
4
5
6
7
8
VARABLE3=`cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<report>
<img src="a-vs-b.jpg"/>
<caption>Thus is a future post on Multi Line Strings in bash
<date>1511</date>-<date>1512</date>.</caption>
</report>
EOF`
例8:
1
2
3
4
5
6
tee aa.txt << EOF
echo "Hello World 20314"
EOF
cat aa.txt
#echo "Hello World 20314"
例如10:
1
2
3
4
5
6
sudo sh -c "cat > /aaa.txt" <<"EOT"
this text gets saved as sudo - $10 - ten dollars ...
EOT
cat /aaa.txt
#this text gets saved as sudo - $10 - ten dollars ...
例11:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cat << "EOF" | sudo tee /aaa.txt
let's count
$one
two
$three
four
EOF
cat /aaa.txt
#let's count
#$one
#two
#$three
#four
关于 tee
1
2
3
4
5
6
7
8
9
10
11
12
> tee –help
Usage: tee [OPTION]… [FILE]…
Copy standard input to each FILE, and also to standard output.
-a, –append append to the given FILEs, do not overwrite
-i, –ignore-interrupts ignore interrupt signals
–help display this help and exit
–version output version information and exit
If a FILE is -, copy again to standard output.
Report tee bugs to bug-coreutils@gnu.org
GNU coreutils home page:
General help using GNU software:
For complete documentation, run: info coreutils ‘tee invocation’