【发布时间】:2010-09-17 04:28:39
【问题描述】:
我有两个经常需要使用相同参数运行的脚本:
$ populate.ksh 9241 && check.ksh 9241
当我需要更改参数时(本例中为9241),我可以返回并编辑历史记录中的行。但是由于我需要在两个地方更改数字,所以我有时会打错字。我希望能够只更改一次参数以在两个地方进行更改。
【问题讨论】:
标签: bash command-line scripting
我有两个经常需要使用相同参数运行的脚本:
$ populate.ksh 9241 && check.ksh 9241
当我需要更改参数时(本例中为9241),我可以返回并编辑历史记录中的行。但是由于我需要在两个地方更改数字,所以我有时会打错字。我希望能够只更改一次参数以在两个地方进行更改。
【问题讨论】:
标签: bash command-line scripting
已经给出了正确的答案,但为了更一般的理解,请阅读手册页,特别注意 “历史扩展” 和相关的 shell 变量(例如“HISTCONTROL”、“@ 987654322@”等)。顺便说一句——你的寻呼机的搜索功能在阅读man bash时非常有用
【讨论】:
一种解决方案是简单地创建一个包装脚本 (populate_check.ksh),依次调用这些脚本:
r=$1
populate.ksh $r && check.ksh $r
或者对于多个参数:
for r; do
populate.ksh $r && check.ksh $r
done
对于更短暂的任务,您还可以对命令进行参数化,以便更容易在历史记录中进行编辑:
$ r=9241; populate.ksh $r && check.ksh $r
或者一次做几个:
$ for r in 9241 9242; do populate.ksh $r && check.ksh $r; done
【讨论】:
for r 等同于 for r in "$@",对于那些不幸使用不支持较短形式的 shell 的人。
在 bash 中:
!!:gs/9241/9243/
是的,它使用gs///,而不是s///g。 :-)
(zigdon 的回答使用最后一个以pop 开头的命令,例如populate.sh。我的回答使用最后一个命令,句号。选择适合你的。)
【讨论】:
您还可以使用历史替换功能:
!pop:gs/9241/1234
像这样:
$ populate.ksh 9241 && check.ksh 9241
...
$ !pop:gs/9241/1234
populate.ksh 1234 && check.ksh 1234
...
【讨论】: