了解如何使用Bash脚本计算DNI字母

满足后 要求能够运行bash脚本,并了解 如何定义功能, 学习怎样 在bash函数中返回值。 为此,我们将在Bash中创建一个小型但功能强大的程序, 计算DNI的字母。 我有个好消息:Bash也可以 在Windows 10上安装。 借助可以在操作系统中添加Linux的所有功能的功能,我们可以说...与众不同。

首先,我们必须 了解如何 子串,无论使用哪种语言,它都有可能 返回字符串的一部分 从链条的指示,段的位置和长度。 让我们看一下这种行为的一个例子。 我们用以下命令创建脚本

$ touch prueba_substring
$ 

然后,使用您喜欢的编辑器添加以下代码。 在终端模式下 我首选的编辑器是mcedit。 但是最近我看到纳米正在增强。

 
#!/usr/bin/env bash 
# Demo comportamiento de substrings en Bash 
# Pedro Ruiz Hidalgo 
# version 1.0.0 
# Febrero 2017 

ret="\n" 
CADENA="siempre uso Linux con Ubuntu y Ubunlog, claro!" 
#      "0123456789012345678901234567890123456789012345" 
#      "          1         2         3         4     " 
# (usa la regla para medir los caracteres) 

echo -e $ret ${CADENA:12} 
echo -e $ret ${CADENA:12:5} 
echo -e $ret "Aprendo en ${CADENA:31:7}" 
exit 0 

添加权限并像这样执行:

$ chmod +x prueba_substring
$ ./prueba_substring
$

如果一切顺利,它应该返回以下结果:

 Linux Con Ubuntu y Ubunlog, claro!

 Linux

 Aprendo en Ubunlog

子串操作

正如你在上面看到的 我突出显示了第13至15行 从脚本和步骤到 解释你的代码. 回音参数“ -e” 让我们来展示 下一行字符,我们已经在 第7行并分配给变量«ret».

第13行:我显示了子字符串(子串),如第8行所述 从位置12开始. 总是从位置0开始计数.

第14行:从 CHAIN变量的位置12,我显示了5的段。 正如您将要验证的,这对应于 子字符串“ Linux”.

第15行:我撰写了一个 用引号引起来的新字符串 我从《我学习》开始,接着是CHAIN变量的子字符串 从第31位开始,取7分:这对应于 «Ubunlog».

回发功能

使用Bash的返回机制是由“ return”命令产生的,尽管当我们必须将其与Bash变量进行匹配时,它实现了一种“奇怪的”机制,您必须习惯这种机制。 让我们看下面的例子:

#!/usr/bin/env bash

function suma(){
  local a=$1
  local b=$2
  return $(( $a + $b ))
}

suma 12 23
retorno=$?
echo $retorno

必须始终在Bash中使用函数之前定义函数因此, 家当 我们在第4行声明函数sum 我们通过“本地”定义第一个参数的分配 ($ 1)到变量“ a”。 第5行的相同步骤,其中 我们将第二个参数a($ 2)分配给变量«b»。 在第XNUMX行中,我们用两个参数调用sum函数,这两个参数将通过 变量“ a”和“ b”,并通过“ return”返回它们,可以在功能说明中轻松看到。

我们在 第10行执行函数sum的结果.

在学习并理解了其中的方式之后 值的返回以及对变量的赋值 让我们来看一下我们的程序 用Bash计算DNI字母.

用Bash计算DNI字母的脚本

#!/usr/bin/env bash

nl="\n"

LETRAS="TRWAGMYFPDXBNJZSQVHLCKEO"
NORMAL=0
ERROR=66

if [ $# -lt 1 ];
then
	echo -e "$nl Cálculo DNI, introduce número$nl"
	read -r ndni
	[ -z "${ndni//[0-9]}" ] && [ -n "$ndni" ] || echo "Sólo números" && exit $ERROR
else
	ndni=$1
fi

modulo ()
{
	return $(( $ndni  % 23 ))
}

modulo ndni
mod=$?
echo $ndni-${LETRAS:$mod:1}
exit $NORMAL

La DNI的来信 对应于 编号模块23。 埃斯托斯 我们将数字除以23 y 而不是看商 我们观察其余部分。 换句话说,就像 被23整除的数字将为零,那封信 对应的是«T», 从此 在位置0,正如我们在上面的脚本中看到的那样, 所有子串从零开始计数。 也就是说,通过该模块,我们将始终获得数字 在0(字母“ T”)和22(字母“ O”)之间。 与其他语言一样,在Bash中 该模块是通过百分比运算符“%”获得的.

第5行,我们定义字母 在您的订单中。 很明显, 订单无法更改 获得可靠的结果。 如果该行 9 我们在问 如果在调用脚本时有一个数字作为参数。 如果没有参数,我们将通过键盘在第11到13行中的指令通过键盘请求它。如果使用数字调用脚本以计算第15行的顺序,则将该参数分配给变量«ndni»。

在第23行中,我们通过的参数引用模函数 变量“ ndni”,它已作为bash中的参数收集,或通过键盘作为输入。 在第24行中,该函数的返回被分配给变量«mod»。 在25 m线上根据模数和子字符串的计算,我们显示与位置对应的数字,破折号和字母.

测试我们的DNI脚本

$ ./dni 12345678
12345678-Z

好吧,

$ ./dni

 Cálculo DNI, Introduce número

我们所有的脚本都应为作者提供一个“ -a”参数,并为帮助和语法提供一个“ -h”参数。 正如我们在之前的文章中所看到的,或者我留给您以避免避免使代码变得更加繁琐。
我希望并希望您一直对本文感兴趣。


4条评论,留下您的评论

发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   奥马尔(Omar BM)

    您好,有人可以帮我吗,我需要在旧台式机上安装lubuntu,但它不会让我通过USB安装并且DVD驱动器已损坏,我只想安装 http://www.plop.at 到Ubuntu 16.04 LTS,但我不知道该怎么做。 谢谢

    1.    Pedro Ruiz Hidalgo的占位符图像

      奥马尔

      如您所述,情况不是很乐观:不允许使用USB并且DVD驱动器已损坏。 但是您还评论说“计算机是旧的”,这意味着您有一台新计算机。 尝试将安装从工作计算机上放置到硬盘驱动器上,然后尝试从该驱动器上安装它。

      问候

    2.    塞萨尔·德尔巴(Cesar Delba)

      您有一台电脑和一个可移动的盒子吗? 将旧计算机的硬盘驱动器安装在可移动USB盒中,然后启动安装盘。
      Linux和Unix在启动级别不考虑硬件,使用它可以在安装了Linux的情况下再次放置磁盘。

    3.    奥马尔(Omar BM)

      非常感谢,我告诉你,我要做的是在同一操作系统下从Ubuntu 16.04转到Lubuntu 16.04,这就是我的旧计算机运行良好的方式,来自哥伦比亚的问候。