用于比较 2 个输入参数并显示共享字母的脚本

swa*_*wam 4 linux shell shell-script

我正在编写一个脚本,我希望用户输入两个单独的单词,结果显示这两个单词共享哪个字母。例如 ./share Cat Rat - 将返回共享字母:“a”和“t”。我的想法是循环阅读 $1 和 $2,但在那之后,我不确定该去哪里。我刚刚开始学习脚本和 unix,所以感谢任何帮助!

#!/bin/sh

echo "$1"|while read line
Run Code Online (Sandbox Code Playgroud)

pet*_*rph 5

如果你可以依赖 Bash 内置的正则表达式(即=~运算符)和数组变量,你可以使用这样的东西:

#!/bin/bash
W1=( $( echo "$1" | sed "s/./\n&/g" | sort -u ) )
W2="$2"
set ${W1[*]}

while [[ ! -z "$1" ]]; do
    if [[ "$W2" =~ "$1" ]]; then
        printf "$1 "
    fi
    shift
done
printf "\n"
Run Code Online (Sandbox Code Playgroud)

第一行创建一个数组,其中包含$1. 接下来,$2保存,然后将位置参数设置为$W1元素的值。然后每个字符(现在是位置参数)与保存的第二个单词匹配,如果找到匹配,则打印出来。最后,位置参数被移动,以便循环继续下一个字符。

您可以在这里看到的概念:使用数组、将命令的输出捕获到变量中、更改位置参数、循环和条件语句。

如果你想简单地做,你可能想考虑例如这个(实际上它是一个单行拆分以提高可读性):

#!/bin/bash
printf "$1" \
    | sed "s/./\n&/g" | sort -u \
    | grep -F "$( printf "$2" | sed 's/./&\n/g' | sort -u )"
Run Code Online (Sandbox Code Playgroud)

sed | sort -u连击刚刚拆分的话为每线形式中的一种独特的性格。grep -F治疗参数(在此为分割第二个字)作为固定的字符串是在输入要匹配,因此它会尝试每一个字符在匹配$1与每个字符$2。在实际情况下,您可能会删除第二个sort | uniq组合,因为“单词”通常很短,并且任何性能提升都会因产生两个额外的进程而被扼杀。但是,随着$2变大(成百上千行),您肯定希望进行任何可能的优化。

您也可以sedfold -w 1which命令替换几乎相同的命令(键入更短,但sed'ss命令是文本处理的瑞士军刀)。