变量定义及变量输出


单引号、双引号、反引号与不加引号的说明
单引号:所见即所得,即输出时会将单引号内的所有內容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,这称为强引用。
双引号 (默认):输出双引号内的所有内容;如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,推荐使用,这称为弱引用。
无引号:赋值时,如果变量内容中有空格,则会造成赋值不完整。而在输出内容时,会将含有空格的字符串视为一个整体来输出;如果内容中有命令(要反引下)、变量等,则会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要双引号替代无引号的情况,特别是对变量赋值时改加双引号。一般连续的字符串、数字、路径等可以不加任何引号进行赋值和输出,不过最好是用双引号替代无引号的情况,特别是对变量赋值时。
反引号:一般用于引用命令,执行的时候命令会被执行,相当于S0,赋值和输出都要用“将命令引起来。

对由反引号引起来的 `date`或 $(date)进行测试:
[root@testdb ~]# echo 'today is date'
today is date
[root@testdb ~]# echo 'today is `date`'
today is `date`
[root@testdb ~]# echo "today is date"
today is date
[root@testdb ~]# echo "today is `date`"
today is Tue Apr 9 14:15:17 CST 2019
[root@testdb ~]# echo today is $(date)
today is Tue Apr 9 14:15:41 CST 2019

变量定义后,在调用变量输出打印时加引号测试
[root@testdb ~]# LIANG=testchars
[root@testdb ~]# echo $LIANG
testchars
[root@testdb ~]# echo '$LIANG'
$LIANG
[root@testdb ~]# echo "$LIANG"
testchars

grep过滤字符串时给过滤的内容加引号
[root@testdb ~]# LIANG=testchars
[root@testdb ~]# grep "$LIANG" grep.log
testchars
[root@testdb ~]# grep '$LIANG' grep.log
[root@testdb ~]# grep $LIANG grep.log
testchars

sed过滤字符串时给过滤的内容加引号
[root@testdb ~]# cat sed.log
testchars
liang
[root@testdb ~]# LIANG=testchars
[root@testdb ~]# sed -n /"$LIANG"/p sed.log
testchars
[root@testdb ~]# sed -n /'$LIANG'/p sed.log
[root@testdb ~]# sed -n /$LIANG/p sed.log
testchars

sed和grep的测试是一致的,唯有awk有点特殊。
awk变量总结:不管变量如何定义、赋值,除了加单引号以以外,利用awk直接获取变量的输出,结果都是一样的。
awk加单引号后再同时加双引号,总能正确输出。
因此,awk取用shell变量应该先用echo 加符号输出变量,然后通过管道给awk,进而控制变量的输出结果。
使用awk调用shell中的变量,分别针对加引号、不加引号等情况进行测试:
[root@testdb ~]# ETT=123
[root@testdb ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@testdb ~]# awk 'BEGIN {print $ETT}'

[root@testdb ~]# awk 'BEGIN {print '$ETT'}'
123
[root@testdb ~]# awk 'BEGIN {print "'$ETT'"}'
123

[root@testdb ~]# ETT='test'
[root@testdb ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@testdb ~]# awk 'BEGIN {print $ETT}'

[root@testdb ~]# awk 'BEGIN {print '$ETT'}'

[root@testdb ~]# awk 'BEGIN {print "'$ETT'"}'
test

[root@testdb ~]# ETT="testtest"
[root@testdb ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@testdb ~]# awk 'BEGIN {print $ETT}'

[root@testdb ~]# awk 'BEGIN {print '$ETT'}'

[root@testdb ~]# awk 'BEGIN {print "'$ETT'"}'
testtest

[root@testdb ~]# ETT=`pwd`
[root@testdb ~]# awk 'BEGIN {print "$ETT"}'
$ETT
[root@testdb ~]# awk 'BEGIN {print $ETT}'

[root@testdb ~]# awk 'BEGIN {print '$ETT'}'
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unterminated regexp
awk: cmd. line:1: BEGIN {print /root}
awk: cmd. line:1: ^ unexpected newline or end of string
[root@testdb ~]# awk 'BEGIN {print "'$ETT'"}'
/root

[root@testdb ~]# ETT="testdb"
[root@testdb ~]# echo "$ETT"|awk '{print $0}'
testdb
[root@testdb ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@testdb ~]# echo $ETT |awk '{print $0}'
testdb

[root@testdb ~]# ETT=`pwd`
[root@testdb ~]# echo "$ETT"|awk '{print $0}'
/root
[root@testdb ~]# echo '$ETT'|awk '{print $0}'
$ETT
[root@testdb ~]# echo $ETT |awk '{print $0}'
/root



原文地址:https://www.cnblogs.com/l10n/p/12610882.html