【问题标题】:How to process basic commandline arguments in Bash?如何在 Bash 中处理基本的命令行参数?
【发布时间】:2016-09-04 16:11:33
【问题描述】:

所以我今天开始研究如何使用 vim 编写脚本,但我非常迷茫,正在寻找一些领域的帮助。

对于我的第一个项目,我想将文件作为命令行参数处理,如果用户执行此脚本时未包含文件,则应显示使用消息,然后退出程序。

我什至不知道从哪里开始,我需要if ... then 声明还是什么?

【问题讨论】:

  • 不要把学习 vim 和 bash 作为一项练习来折磨自己。使用简单的编辑器并查看Bash Guides(初学者和高级)供初学者使用。
  • 查看Check if passed argument is file or directory in bash 并将其提炼为检查文件是否存在部分。
  • 没有任何尝试编写代码,您基本上是在要求代码。你也可以只要求一个代码。标题和内容应为“请编写检查传递参数是否为文件的代码”。我建议,发布您理解的伪代码,然后我们将帮助bash-ism。
  • 在使用 StackExchange 之前,请阅读一些简单的 Bash 教程。我同意不要同时尝试学习 vim。但是您要问的是非常基本的 shell 脚本(接受参数),并表明您自己没有做太多研究。

标签: bash shell


【解决方案1】:

保存vim 以备后用,尝试一次学习一件事。一个更简单的文本编辑器称为nano

现在,就检查文件作为参数,并在其他情况下显示使用消息而言,这是一个典型的模式:

PROGNAME="$0"

function show_usage()
{
    echo "Usage: ${PROGNAME} <filename>" >&2
    echo "..." >&2

    exit 1
}

if [[ $# -lt 1 ]]; then
    show_usage
fi

echo "Contents of ${1}:"
cat "$1"

让我们分解一下。

PROGNAME="$0"

$0 是脚本的名称,因为它是在命令行中调用的。

function show_usage()
{
    echo "Usage: ${PROGNAME} <filename>" >&2
    echo "..." >&2

    exit 1
}

这是打印“使用”消息并以失败状态代码退出的函数。 0 是成功,0 以外的任何东西都是失败。请注意,我们将echo 重定向到&amp;2——这会在标准错误而不是标准输出上打印使用消息。

if [[ $# -lt 1 ]]; then
    show_usage
fi

$# 是传递给脚本的参数数量。如果该数字小于 1,则打印使用消息并退出。

echo "Contents of ${1}:"
cat "$1"

$1 是文件名——脚本的第一个参数。我们可以在这里做任何我们想做的处理,$1 是文件名。希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我想你是在问如何编写一个 bash 脚本,该脚本需要一个文件作为命令行参数,如果有问题则退出并显示使用消息:

    #!/bin/bash
    
    # check if user provided exactly one command-line argument:
    if [ $# -ne 1 ]; then
      echo "Usage: `basename "$0"` file"
      exit 1
    # now check if the provided argument corresponds to a real file
    elif [ ! -f "$1" ]; then
      echo "Error: couldn't find $1."
      exit 1
    fi
    
    # do things with the file...
    stat "$1"
    head "$1"
    tail "$1"
    grep 'xyz' "$1"
    

    【讨论】:

    • 不客气 :) ps:我刚刚修正了一个错字; if [ -e ... ](存在)-> if [ ! -e ... ](不存在)。
    • 几件事。测试$# 不相关吗?如果用户传递了一个目录名,那么其中一些命令会失败,所以-f 可能是一个更好的测试。
    猜你喜欢
    • 2018-03-12
    • 2014-08-12
    • 2011-07-08
    • 1970-01-01
    • 2012-11-25
    • 2010-10-08
    • 2011-01-10
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多