从给定输入中分离冒号的 Shell 脚本
Linux 因其提供终端/命令行界面 (CLI) 功能的能力而受到开发人员和计算机科学界的欢迎。通过 CLI,用户可以执行命令来执行所需的任务。 Bash 通常可互换地称为 shell,它是一种流行的脚本语言,其中可以通过 CLI 执行一组命令。
Bash 提供了多种接受来自用户的输入(任意数量)的方式,例如命令行参数、基于提示等。通常命令行参数输入的处理速度更快,因为它们是在脚本执行开始之前提供的。如果需要,会从用户动态收集基于提示的输入。在我们的问题陈述中,我们确信我们将获得输入项,因此我们将继续假设这些项是作为命令行参数收集的。
分隔符是一种简单的语言,可以解释为基于某些业务逻辑分隔项目的分隔符。在问题陈述中,将冒号 (:) 视为分隔符。我们都熟悉分隔符,因为我们会遇到逗号 (,) 作为分隔符的 .csv(逗号分隔值)文件。所以基于定界符分离或解析输入通常是任何业务逻辑处理的第一步,因此以下问题陈述及其解决方案将在 bash 脚本中具有不同范围的应用。
问题陈述:对于给定的输入项,使用分隔符作为冒号分隔项。以下是相同的各种用例,
样本输入:
CASE 1: Simple input items separated by colon. Example: First Names/Words separated by Colon.
./Colon.sh Geek:For:Geeks:Good
CASE 2: Special Characters inclusive input like "@!"£$%." etc. Example: Email Addresses separated by colon
./Colon.sh "abc@gmail.com:xyz@gmail.com:Exclamation!"
CASE 3: Space is included in the input items/words. Example: Full Names Separated by Colons
./Colon.sh "Geeks for Geeks is good: Open Source Community: Great Contributions"
CASE 4: Space as well as Quotes are Included in the Input Item. Example: Combination of case 2 and 3.
./Colon.sh 'Geeks "ForGeeks":Amazingly "Awesome":Detailed "Examples"'
方法:
- 使用cut命令在while循环的帮助下对给定的输入项进行基于定界符的分隔,以遍历它们。
- 最初,定义一个字段变量(将变量的名称保留为字段,因为cut命令具有选项-f ,它在脚本中使用,这意味着字段编号)并将其设置为1,因为我们从第一个开始物品。
- 启动 while 循环,该循环将用于分别遍历给定的输入项。
- 通过以充当输入到剪切命令和使用定界符(-d)和切口的场数(-f)选项的每个项目被印刷基于场数剪切命令他们|然后回声输入项目和管()由分隔符隔开为冒号(:)。
- 打印每个输入项目后,增加字段变量以处理/打印下一个项目。
- 有一个条件语句来检查字段th项是否为空(这反过来意味着所有输入项都被处理/分离并成功打印)如果为空则 while 循环和 shell 脚本成功退出,否则继续打印输入当前项目和递增字段变量,直到处理完所有输入项目。
Shell 脚本:以下是 Shell 脚本 (Colon.sh),它将第一个参数作为给定的项目列表进行处理,并基于冒号“:”作为分隔符将它们分开。
#! /bin/bash
# Set initial field for cut to 1
field=1
# Using while loop to traverse through input items
while [ 1 ]
do
# Printing each item
s=`echo $1 | cut -d ":" -f $field`
# Condition to check if Input is processed, Quotes are
# essential for processing sepcial characters in the input
if [ ! "$s" ]
then
# if input processing is finished then exit else continue
exit
else
# Print each item/word from input
echo $s
# Incrementing field after each word being processed.
field=`expr $field + 1`
fi
done
输出:
解释:
CASE 1: ./Colon.sh Geek:For:Geeks:Good
Geek
For
Geeks
Good
上面的输入是一个简单的简单单词的简单情况(只有字符AZ 和 az 存在),因此输入中没有包含特殊字符或空格,因此即使输入项周围没有使用引号也可以作为脚本会将整个项目列表视为 1 个命令行参数并按预期进行处理。因此Geek:For:Geeks:Good只是简单地处理以分离单词(实际示例可能是名字)并作为输出打印(如屏幕截图图 1 所示)。
CASE 2: ./Colon.sh "abc@gmail.com:xyz@gmail.com:Exclamation!"
abc@gmail.com
xyz@gmail.com
Exclamation!
在上述情况下,输入中会考虑特殊字符,如“@”、“'”等。为了成功地让脚本理解输入,覆盖双引号(“ ” )包围的输入项。同样在脚本中的输入完成检查( if [ ! “$s” ] )中,我们用引号将检查括起来以进行正确的解析。因此,对于输入“ abc@gmail.com:xyz@gmail.com:Exclamation!” (:)中所见的屏幕截图。图1用定界符作为结肠获得了正确地分离输入的项目。
CASE 3: ./Colon.sh "Geeks for Geeks is good: Open Source Community: Great Contributions"
Geeks for Geeks is good
Open Source Community
Great Contributions
在上述情况下,空格是给定输入项的有效字符。现在这里的问题 Bash 假设命令行参数用空格分隔,因此在输入项的这种情况下,它将假设“ Geeks是第一个命令行参数, For是 2 nd , Geeks是第三个等等。为了避免这个问题,用双引号(“ ” )将输入括起来。所以现在引用的输入变成只有 1 个命令行参数并按照我们的需要进行处理,输入是“ Geeks for Geeks is good: Open Source Community: Great Contributions” ,可以假设为使用冒号分隔人员的全名( : ) 作为分隔符,如图 1 中的屏幕截图所示。
CASE 4: ./Colon.sh 'Geeks "ForGeeks":Amazingly "Awesome":Detailed "Examples"'
Geeks "ForGeeks"
Amazingly "Awesome"
Detailed "Examples"
在上述情况下,现在假设双引号(“ ” )被视为输入项本身的有效字符,以便处理更改输入项周围的单引号( '' )以成功解析。所以上面的输入'Geeks “ForGeeks”:Amazingly “Awesome”:Detailed “Examples”'可以被认为是一个带引号的形容词句子的例子,作为输入给出,并将根据需要进行处理以给出定界符冒号( :)基于分离的输出,如图 1 所示。
因此,这个简单的 shell 脚本使用冒号 (:) 作为分隔符分隔给定的输入项具有广泛的应用,并且可以稍微修改以更改任何所需的分隔符,如逗号 (,)、分号 (;) 等。