[20231029]使用cygwin调式bash shell引出的问题.txt
--//今天起床后,外面一直淅淅沥沥地下着小雨,本来想等雨停了,出去锻炼的,可是小雨一直下个不停.
--//只能使用电脑,顺便写一个脚本完成bbed查看索引kd_off结构的问题.
--//家里的电脑没有linux环境,我也没有安装虚拟机,实在太慢了.想着使用cygwin调式bash shell,没想到遇到问题.
--//我以前就遇到文本回车换行问题,参考链接:
--//http://blog.itpub.net/267265/viewspace-2784841/ => [20210802]cygwin文本回车换行问题.txt
--//今天有遇到其它问题,记录一下:
$ seq 10| sed -n "$p"
--//本来想使用sed取出最后1行的,结果没有输出.我以前记忆里面连在一起没有问题的(更正一下,我的记忆出现错误,看后面的补充信息)
$ seq 10| sed -n "\$p"
10
--//原来cygwin在bash shell解析上存在问题,双引号里面的$解析为bash shell变量的一部分.改写如下:
$ p='$p'
$ Q='$p'
--//注意使用单引号.
$ seq 10| sed -n "$p"
10
$ seq 10| sed -n "$Q"
10
--//当然写成如下,$和p之间加入1个空格.
$ seq 10| sed -n "$ p"
10
--//当然还有1种写法就是使用单引号,这样避免双引号里面对bash shell变量的解析.
$ seq 10| sed -n '$p'
10
--//实际上上面的问题还好规避,我尽量使用单引号就是了.
--//但是awk在windows下使用必须使用双引号,这样变得就非常复杂,现在想起来记忆混乱发生在这里!!
--//比如我想更正kd_off的输出,bash shell里面写成如下:
$ echo p dba 11,156 kd_off | rlbbed | grep kd_off | sed -n '3,$p' | awk -F'[][]' '{printf "%s[%d]%40s\n",$1,$2-2,$3}'
b2 kd_off[0] @136 8024
b2 kd_off[1] @138 8012
b2 kd_off[2] @140 8000
b2 kd_off[3] @142 7988
b2 kd_off[4] @144 7976
b2 kd_off[5] @146 7964
b2 kd_off[6] @148 7952
b2 kd_off[7] @150 7940
b2 kd_off[8] @152 7928
b2 kd_off[9] @154 7916
b2 kd_off[10] @156 7904
b2 kd_off[11] @158 7893
--//如果在windows命令行上执行,必须写成如下:
d:\tools\bbed>echo p dba 11,156 kd_off | rlbbed | grep kd_off | sed -n "3,$ p" | gawk -F"[][]" "{printf \"%s[%d]%40s\n\",$1,$2-2,$3}"
b2 kd_off[0] @136 8024
b2 kd_off[1] @138 8012
b2 kd_off[2] @140 8000
b2 kd_off[3] @142 7988
b2 kd_off[4] @144 7976
b2 kd_off[5] @146 7964
b2 kd_off[6] @148 7952
b2 kd_off[7] @150 7940
b2 kd_off[8] @152 7928
b2 kd_off[9] @154 7916
b2 kd_off[10] @156 7904
b2 kd_off[11] @158 7893
--//sed必须使用双引号.awk也是类似,并且里面的printf也必须使用双引号,这样必须\转义.
--//上班在linux机器测试一下:
$ seq 10 | sed -n "$p"
$ seq 10 | sed -n '$p'
10
--//看来我记错了,老了.可以理解bash shell在双引号下,$p当作变量解析.
--//我开始以为awk不受这个限制.实际上也是一样的.看如下例子:
$ seq 10 | paste -d" " - - | awk '{print $1}'
1
3
5
7
9
$ seq 10 | paste -d" " - - | awk "{print $1}"
1 2
3 4
5 6
7 8
9 10
--//双引号下,$1解析为空.相当于执行print,自己以后在bash shell编程中注意这个细节.
--//哦,我终于明白我为什么在这个问题上这么混乱了,在bash shell 下双引号$a 会解析为某个变量。
--//而在windows的命令行下,awk,sed,grep之类的只能使用双引号并且不受这个影响,看下面的例子:
D:\>seq 10 | sed -n '$p'
sed: -e expression #1, char 1: Unknown command: ``'''
D:\>seq 10 | sed -n '$ p'
sed: -e expression #1, char 1: Unknown command: ``'''
D:\>seq 10 | sed -n "$p"
10
D:\>seq 10 | awk "NR==10{print $1}"
10
--//windows下$p之类的解析没有问题,因为windwos的cmd不会解析$p,$1当作变量处理。
D:\>seq 10 | awk 'NR==10{print $1}'
awk: cmd. line:1: 'NR==10{print
awk: cmd. line:1: ^ Invalid char ''' in expression
D:\>echo "111" | grep "1"
"111"
D:\>echo "111" | grep '1'
--//实际上grep 过滤的字符串是'1'.
d:\>echo "1111"'1'
"1111"'1'
--//注意windows下echo与bash shell下的echo输出不同.
d:\>echo "1111"'1' | grep '1'
"1111"'1'
d:\>D:\tools\linux\usr\local\wbin\echo "1111"'1'
1111'1'