我经常通过制作长 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 转到新行。
保存为一条历史记录;您可以按照预期使用箭头键移动。仅当您在顶行/底行向上/向下移动时,它才会切换条目。