[20210510]变态的windows批处理7.txt
--//想写一个批处理在windows下,遇到一个奇怪的问题,记录自己的分析过程.
d:\>seq 3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q;\nselect count(name) from from t where id=1;"
;lter session set optimizer_index_cost_adj = 1
select count(name) from from t where id=1;
;lter session set optimizer_index_cost_adj = 2
select count(name) from from t where id=1;
;lter session set optimizer_index_cost_adj = 3
select count(name) from from t where id=1;
--//很奇怪,分号跑到最前面,什么回事,加入多个空格,继续测试:
d:\>seq 3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q ;\nselect count(name) from from t where id=1;"
;ter session set optimizer_index_cost_adj = 1
select count(name) from from t where id=1;
;ter session set optimizer_index_cost_adj = 2
select count(name) from from t where id=1;
;ter session set optimizer_index_cost_adj = 3
select count(name) from from t where id=1;
--//视乎Q后面的字符都会到前面.
d:\>seq 3 | xargs -iQ echo "alter session set optimizer_index_cost_adj = Q ;\nselect count(name) from from t where id=1;" > aa.txt
--//使用vim下打开发现问题所在:
alter session set optimizer_index_cost_adj = 1
;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 2
;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 3
;
select count(name) from from t where id=1;
--//可以发现后面多了一个^M,实际上就是回车字符\r.导致显示输出感觉分号跑到前面.
--//实际上问题出在seq的输出以及windows对于文本格式的处理,windows文本默认是回车换行.
--//对于windows下的seq的输出也包含回车换行与linux的seq输出有一点点不通.知道问题所在解决就很简单.加入一个tr处理就ok了.
d:\>seq 3 | tr -d '\r' |xargs -iQ echo "alter session set optimizer_index_cost_adj = Q;\nselect count(name) from from t where id=1;"
alter session set optimizer_index_cost_adj = 1;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 2;
select count(name) from from t where id=1;
alter session set optimizer_index_cost_adj = 3;
select count(name) from from t where id=1;
--//另外一个细节要注意xargs后面调用的命令echo是外部命令,windows下的内部命令echo也很变态.看下面的例子:
d:\>echo '123' "456"
'123' "456"
d:\>D:\tools\linux\usr\local\wbin\echo '123' "456"
'123' 456
--//注意看两者的区别,windows下命令行仅仅将双引号的作为字符串,而单引号不是.导致awk命令在windows写的很难看或者难写.
--//我个人建议widnows下还是在Cygwin64 Terminal下使用来写shell脚本.看下面的输出:
$ echo '123' "456"
123 456
--//总之,windows下会变得非常麻烦.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2771852/ ,如需转载,请注明出处,否则将追究法律责任。