我编写了一个shell脚本,用于自动执行从终端运行的某些任务 -
v@ubuntu:$ ./automate.sh from:a1 to:a2 msg:'edited'
我如何(如果有的话)自定义脚本,以便在单独的行中以自定义格式输入每个参数,并通过按其他键来执行它来执行shell脚本?所以,我会这样做 -
v@ubuntu:$ ./automate.sh
from : a1
to : a2
msg : 'next change'
...然后点击说Ctrl+Enter
或F5
来执行此特定脚本?
注意:我知道只需输入./automate.sh \
并在尾随反斜杠之后点击Enter
以获得新行,就会有一个黑客的工作,但我希望能够从脚本本身找到一种更优雅的方法。
另外,我故意将每个参数更改为包含空格和msg参数以包含带空格的字符串。因此,如果有人能指出我正确的方向,如何实现这一点作为一个额外的奖励,我将非常感激:))
答案 0 :(得分:1)
如果您知道参数的数量很容易。首先是基础知识。
#!/bin/bash
if [ $# == 0 ]
then
read v1 # gets onto new line. reads the whole line until ENTER
read v2 # same
read v3 # same
fi
# Parse $v1, $v2, $v3 as needed and run your script
echo ""
echo "Got |$v1|, |$v2|, |$v3|"
当您键入automate.sh
并按Enter键时,脚本已启动,未收到任何参数。如果没有参数($# == 0
),则会执行第一个read
,它会打印一个新行,等待,并将输入的行(一旦输入命中)输入$v1
。控件返回到脚本,下一个读取将获得下一个类型的行......在最后一行之后,它将退出if-else
并继续。解析变量并运行脚本。
会话:
> automate.sh Enter typed line Enter more items Enter yet more Enter Got |typed line| |more items| |yet more| >
您不需要Control-Enter
或F5
,它会在3(3)行之后继续。
这也允许您提供这两种行为。添加else
,如果有一些参数,将执行该read
。然后,您可以通过在第一行(到目前为止的调用)或以这种新方式提供参数来使用脚本。
如果你需要一个数目不详的参数,这种方法需要更多的工作。
将输入行中的单词读入变量
如果read v1 v2
后跟变量名称,如read
,则它会将每个单词读入变量,最后一个变量将获取可能保留在该行上的所有内容。所以用
read k1 p1 s1
read k2 p2 s2
read k3 p3 s3
行
$k1
现在from
包含第一个单词($k2
),而$k3
和$p1
包含第一个单词;然后:
(等)有第二个单词($s1
),a1
(等)在行的末尾包含其他所有内容(a2
,{{1} },'next change'
)。所以你不需要那些单引号。如果您希望脚本在输入之前在每一行上打印某些内容,则所有这些都很容易修改。
根据评论中的澄清,确实不需要像人们想象的那样输入整个字符串。这是“易于修改”
read -p 'from :' s1
read -p 'to :' s2
read -p 'msg :' s3
现在,用户只需要在:
变量中捕获$s
之后输入的部分。其他一切都是一样的。
例如,参见Bash Guide中关于用户输入的部分;他们的Advanced Guide(特殊变量);对于更加复杂的用户互动this post。当然还有man read
。
答案 1 :(得分:1)
在bash中绑定Control-Enter
很困难。如果您可以将其更改为Control-D
,那么所有内容都可能如下所示:
#!/usr/local/bin/bash
read -p 'From: ' from
read -p 'To: ' to
read -p 'Msg: ' msg
read keystroke
if [ "$keystroke" == "^D" ]; then
echo "$from $to $msg"
# do something else
fi