
我經常透過製作長 AND/OR 語句來格式化程式碼。例如:
# Get wifi router gateway
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
有時,像上面這樣的命令中的單一步驟可能會很複雜。因此我最終想發表評論。
例如,假設該cut
命令比實際情況更複雜。所以我想做一些類似的事情:
# Get wifi router gateway
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
# Here is a note
| cut -d' ' -f5 \
| tr --delete \;)
我意識到這是無效的語法。
但我很好奇是否還有其他人有一些評論長命令鏈的策略?
答案1
這似乎適用於 Bashdash
等:
#!/bin/sh
seq 20 | # make a long list
grep '[234]' # mut only take part of it
與管道類似&&
或||
代替管道,以及在內部$( ... )
。
答案2
使您的命令具有無效語法的唯一原因是您不必要地轉義了每行上的換行符。
你的命令,
gateway=$(cat $leases \
| grep -A 5 -m 1 $wifi \
| grep option\ routers \
| cut -d' ' -f5 \
| tr --delete \;)
與
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers | cut -d' ' -f5 | tr --delete \;)
換句話說,從 shell 的角度來看,它根本不是多行指令。
在 之前插入註解cut
會使命令替換不終止(最後的)
被推薦出去):
gateway=$(cat $leases | grep -A 5 -m 1 $wifi | grep option\ routers # Here is a note | cut -d' ' -f5 | tr --delete \;)
但是,無需轉義換行符。以下是完全有效的程式碼:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
| cut -d' ' -f5
| tr --delete \;)
在這裡,插入評論即可:
gateway=$(cat $leases
| grep -A 5 -m 1 $wifi
| grep option\ routers
# Here is a note
| cut -d' ' -f5
| tr --delete \;)
這樣做很好,因為管道的每個部分後面都可能跟著一個或多個換行符,而 shell 的解析器會忽略註解。
看看實際情況程式碼,這是一個更安全、更便攜的變體(除了grep
仍需要使用非標準擴展的初始變體):
gateway=$(grep -A 5 -m 1 -e "$wifi" <"$leases"
| grep -F 'option routers'
# Here is a note
| cut -d ' ' -f 5
| tr -d ';' )
答案3
另外,zsh
它可以模擬 bash (只需將其稱為 bash 或 run emulate bash
),實際上支持多行命令!
只需運行bindkey -e
或bindkey "^[^M" self-insert-unmeta
,然後您可以透過按 M-Return 轉到新行。
儲存為一筆歷史記錄;您可以按照預期使用箭頭鍵移動。只有當您在頂行/底行向上/向下移動時,它才會切換條目。