自定义shell脚本的参数输入例程

时间:2016-03-18 05:36:05

标签: bash shell

我编写了一个shell脚本,用于自动执行从终端运行的某些任务 -

v@ubuntu:$ ./automate.sh from:a1 to:a2 msg:'edited'

我如何(如果有的话)自定义脚本,以便在单独的行中以自定义格式输入每个参数,并通过按其他键来执行它来执行shell脚本?所以,我会这样做 -

v@ubuntu:$ ./automate.sh
from : a1
to : a2
msg : 'next change'

...然后点击说Ctrl+EnterF5来执行此特定脚本?

注意:我知道只需输入./automate.sh \并在尾随反斜杠之后点击Enter以获得新行,就会有一个黑客的工作,但我希望能够从脚本本身找到一种更优雅的方法。 另外,我故意将每个参数更改为包含空格和msg参数以包含带空格的字符串。因此,如果有人能指出我正确的方向,如何实现这一点作为一个额外的奖励,我将非常感激:))

2 个答案:

答案 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-EnterF5,它会在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