检查 bash 脚本是否正好有两个目录参数

asu*_*ura 10 shell scripting bash arguments

我正在编写一个比较两个目录的 bash 脚本,但我不确定如何检查条件

例如,如果用户输入 1 arg 而不是 2(我们需要 2,因为我们正在比较两个目录),它应该给出一个错误。如果两个 arg 都有效,则比较目录和输出到文件。

slm*_*slm 9

处理参数

处理通过脚本命令行传递的参数非常简单,如下所示。假设我们有这个脚本:

$ cat cmd.bash 
#!/bin/bash

echo "arg1: $1"
echo "arg2: $2"
Run Code Online (Sandbox Code Playgroud)

现在不带参数运行:

$ ./cmd.bash 
arg1: 
arg2: 
Run Code Online (Sandbox Code Playgroud)

有 1 个参数:

$ ./cmd.bash hi
arg1: hi
arg2: 
Run Code Online (Sandbox Code Playgroud)

有 2 个参数:

$ ./cmd.bash hi bye
arg1: hi
arg2: bye
Run Code Online (Sandbox Code Playgroud)

检查参数

然后,您可以检查参数 1 和 2 是否为有效目录,然后根据需要退出或继续。所以我们引入了 2 个检查来查看 2 个参数是否是目录,如果不是则退出。

$ cat cmd.bash
#!/bin/bash

[ -d "$1" ] || exit
[ -d "$2" ] || exit
[ $# == 2 ] || exit

echo "arg1: $1"
echo "arg2: $2"
Run Code Online (Sandbox Code Playgroud)

例子

假设我们有这些目录。

$ mkdir d1 d2

$ ls -l
total 12
-rwxrwxr-x. 1 saml saml   89 Oct 14 23:13 cmd.bash
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d1
drwxrwxr-x. 2 saml saml 4096 Oct 14 23:14 d2
Run Code Online (Sandbox Code Playgroud)

如果我们得到了 2 个目录以外的任何东西,脚本将简单地退出。

$ ./cmd.bash hi bye
Run Code Online (Sandbox Code Playgroud)

如果我们有 2 个目录:

$ ./cmd.bash d1 d2
arg1: d1
arg2: d2
Run Code Online (Sandbox Code Playgroud)

如果我们得到超过 2 个参数:

$ ./cmd.bash d1 d2 d3
Run Code Online (Sandbox Code Playgroud)

我会把这两个目录的比较留给你。要学习 Bash,我会引导您访问以下链接,获取有关 Bash 的免费在线书籍。

参考


Gil*_*il' 8

参数的数量在参数中$#

if [ $# -ne 2 ]; then
  echo 1>&2 "Usage: $0 DIRECTORY1 DIRECTORY2"
  exit 3
fi
Run Code Online (Sandbox Code Playgroud)

如果您想强制参数都是目录(而不是其他类型的文件),请使用-d.

该实用程序diff比较两个文件。使用选项-r,它递归地比较目录。

diff -ru -- "$1" "$2"
Run Code Online (Sandbox Code Playgroud)