[20231029]使用cygwin調式bash shell引出的問題.txt

lfree發表於2023-10-30

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2991961/,如需轉載,請註明出處,否則將追究法律責任。

相關文章