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)
如果你可以依赖 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
变大(成百上千行),您肯定希望进行任何可能的优化。
您也可以sed
用fold -w 1
which命令替换几乎相同的命令(键入更短,但sed
'ss
命令是文本处理的瑞士军刀)。