【问题标题】:How can I write code to add and remove functions from a script?如何编写代码以在脚本中添加和删除函数?
【发布时间】:2020-11-24 17:32:55
【问题描述】:

我正在为用户提供向现有 bash shell 脚本添加附加功能的机会。

名为 .profile_app 的现有脚本如下所示:

function start_app() {home/run.sh start}
function stop_app() {/home/run.sh stop}

用户可以用下面的脚本扩展上面的脚本。

  read -p "Name of App" n1
  read -p "How to start" n2
  read -p "How to stop:" n3
            
  echo " function ${n1}_start() { $n2 }" >> /home/.profile_app
  echo " function ${n1}_stop() { $n3 }" >> /home/.profile_app

    

运行此脚本后,.profile_app 将如下所示。

function start_app() { home/run.sh start }
function stop_app() { home/run.sh stop }
    
function test_start() { /etc/init.d/test start }
function test_stop() { /etc/init.d/test stop}

添加新功能一点问题都没有。但是我怎样才能从这个文件中删除一个函数呢?例如。最后添加了 2 个函数 test_start 和 test_stop?它的代码是什么样的?

附录

我想我无法正确描述我的问题。在这种情况下,语法无关紧要。以上脚本只是我实际代码中的简化示例。他们真的很管用。我的问题是,如果用户应该能够从配置文件中删除一个函数(而不是添加它),那么脚本应该是什么样的。例如,用户输入他想再次删除 test_start 和 test_Stop 函数。

喜欢

read -p "Name of App to be deleted" n1


delete "function test_start() { .... }" from .profile_app ???
delete "function test_stop() { .... }" from .profile_app ???

如何使用脚本做到这一点?

【问题讨论】:

  • 与您的问题没有直接关系,但请注意 function funcname() { 合并了两种不同的语法形式,即旧版 ksh​​ function funcname { 和 POSIX funcname() {,其方式与 旧版 ksh​​ 或 POSIX sh(因此与 ash/dash/posh/etc 无缘无故地不兼容)。请参阅wiki.bash-hackers.org/scripting/obsolete——当偏离标准没有任何特定优势时,请考虑继续使用 POSIX 语法。
  • 也就是说,我不建议尝试将脚本添加/删除函数。拥有一个 directory 会更加明智,您的代码只是将新条目作为单独的文件添加到该目录(并且在运行时,每个文件都会被获取)——然后当您想要删除或替换某些内容时,您只需删除或替换整个单个文件;比尝试编写内容感知编辑脚本更不容易出错。
  • 单行函数形式;结束 } 需要分号:start_app() { home/run.sh start; } -- 参见手册中的3.2.4.3 Grouping Commands

标签: bash shell scripting


【解决方案1】:

我建议您使用以下解决方案,其中包含文件夹中的文件,每个函数一个文件。要取消/激活它们,您只需将相应的文件放入该文件夹中,或将其删除。

.profile_app

for file in /path/to/profile/includes/* ; do
    source "${file}"
done

/path/to/profile/includes/start_app.sh

function start_app() {
    /path/to/home/run.sh start
}

/path/to/profile/includes/stop_app.sh

function stop_app() {
    /path/to/home/run.sh stop
}

PS:bash 允许 function 关键字,但 POSIX 不允许,并且没有实际功能。我建议简单地使用:

stop_app() {
    /path/to/home/run.sh stop
}

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多