[20231029]使用cygwin调式bash shell引出的问题.txt

2023年 10月 31日 30.2k 0

[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'

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论