关于shell:如何在Bash中处理基本命令行参数?

How to process basic commandline arguments in Bash?

所以我今天开始研究使用vim的脚本,我非常迷茫,在一些领域寻求帮助。

对于我的第一个项目,我希望将一个文件作为命令行参数进行处理,如果在用户执行此脚本时没有包含文件,那么应该显示一条用法消息,然后退出程序。

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


vim留到以后,试着一次学一件事。一个简单的文本编辑器称为nano

现在,对于以参数形式检查文件并显示用法消息,这是一个典型的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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"

让我们把这个分解。

1
PROGNAME="$0"

$0是脚本的名称,正如在命令行中调用的那样。

1
2
3
4
5
6
7
function show_usage()
{
    echo"Usage: ${PROGNAME} <filename>">&2
    echo"...">&2

    exit 1
}

这是一个打印"usage"消息并使用故障状态代码退出的函数。0是成功的,除0以外的任何东西都是失败的。注意,我们将echo重定向到&2--这将在标准错误而不是标准输出上打印使用消息。

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

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

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

$1是out文件名——脚本的第一个参数。我们可以在这里进行我们想要的任何处理,其中$1是文件名。希望这有帮助!


我认为您在问如何编写一个bash脚本,该脚本需要一个文件作为命令行参数,如果出现问题,将退出并显示用法消息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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"