所以我必须为一个项目制作一个bash脚本,我们必须以一种方式来创建它,我们可以使用不同的方式使用它。运行我的脚本作为bash morse.sh -e Text.txt我的脚本将不会注册我的任何参数意味着我有一个命令echo $ 1并且在运行它时不会显示任何内容作为sh morse.sh -e Text.txt脚本将认识到我的论点(当然还有其他许多错误,但事实并非如此)。
#!/bin/bash
function encode {
echo $1
input=$(<$2)
uppercasemod=`echo $input | tr '[:lower:]' '[:upper:]'`
echo $uppercasemod > $2
for (( i=0; i<${#uppercasemod}; i++ ));
do
char=`echo "${uppercasemod:$i:1}"`
if [[ $char == 'A' ]]
then
sed -i 's/A/.-\t/' $2
elif [[ $char == 'B' ]]
then
sed -i 's/B/-...\t/' $2
elif [[ $char == 'C' ]]
then
sed -i 's/C/-.-.\t/' $2
elif [[ $char == 'D' ]]
then
sed -i 's/D/-..\t/' $2
elif [[ $char == 'E' ]]
then
sed -i 's/E/.\t/' $2
elif [[ $char == 'F' ]]
then
sed -i 's/F/..-.\t/' $2
elif [[ $char == 'G' ]]
then
sed -i 's/G/--.\t/' $2
elif [[ $char == 'H' ]]
then
sed -i 's/H/....\t/' $2
elif [[ $char == 'I' ]]
then
sed -i 's/I/..\t/' $2
elif [[ $char == 'J' ]]
then
sed -i 's/J/.---\t/' $2
elif [[ $char == 'K' ]]
then
sed -i 's/K/-.-\t/' $2
elif [[ $char == 'L' ]]
then
sed -i 's/L/.-..\t/' $2
elif [[ $char == 'M' ]]
then
sed -i 's/M/--\t/' $2
elif [[ $char == 'N' ]]
then
sed -i 's/N/-.\t/' $2
elif [[ $char == 'O' ]]
then
sed -i 's/O/---\t/' $2
elif [[ $char == 'P' ]]
then
sed -i 's/P/.--.\t/' $2
elif [[ $char == 'Q' ]]
then
sed -i 's/Q/--.-\t/' $2
elif [[ $char == 'R' ]]
then
sed -i 's/R/.-.\t/' $2
elif [[ $char == 'S' ]]
then
sed -i 's/S/...\t/' $2
elif [[ $char == 'T' ]]
then
sed -i 's/T/-\t/' $2
elif [[ $char == 'U' ]]
then
sed -i 's/U/..-\t/' $2
elif [[ $char == 'V' ]]
then
sed -i 's/V/...-\t/' $2
elif [[ $char == 'W' ]]
then
sed -i 's/W/.--\t/' $2
elif [[ $char == 'X' ]]
then
sed -i 's/X/-..-\t/' $2
elif [[ $char == 'Y' ]]
then
sed -i 's/Y/-.--\t/' $2
elif [[ $char == 'Z' ]]
then
sed -i 's/Z/--..\t/' $2
elif [[ $char == 1 ]]
then
sed -i 's/1/.----\t/' $2
elif [[ $char == 2 ]]
then
sed -i 's/2/..---\t/' $2
elif [[ $char == 3 ]]
then
sed -i 's/3/...--\t/' $2
elif [[ $char == 4 ]]
then
sed -i 's/4/....-\t/' $2
elif [[ $char == 5 ]]
then
sed -i 's/5/.....\t/' $2
elif [[ $char == 6 ]]
then
sed -i 's/6/-....\t/' $2
elif [[ $char == 7 ]]
then
sed -i 's/7/--...\t/' $2
elif [[ $char == 8 ]]
then
sed -i 's/8/---..\t/' $2
elif [[ $char == 9 ]]
then
sed -i 's/9/----.\t/' $2
elif [[ $char == 0 ]]
then
sed -i 's/0/-----\t/' $2
fi
done
counter=`grep -P '\t' *.txt | wc -w`
for (( i=0; i<counter; i++ ));
do
sed -i 's/ //' *.txt
done
}
以前有人遇到过这个问题吗?
答案 0 :(得分:2)
我会像这样写,所以你只需要调用一次sed:
morse() {
local -A morse=(
[A]='.-' [J]='.---' [S]='...' [2]='..---'
[B]='-...' [K]='-.-' [T]='-' [3]='...--'
[C]='-.-.' [L]='.-..' [U]='..-' [4]='....-'
[D]='-..' [M]='--' [V]='...-' [5]='.....'
[E]='.' [N]='-.' [W]='.--' [6]='-....'
[F]='..-.' [O]='---' [X]='-..-' [7]='--...'
[G]='--.' [P]='.--.' [Y]='-.--' [8]='---..'
[H]='....' [Q]='--.-' [Z]='--..' [9]='----.'
[I]='..' [R]='.-.' [1]='.----' [0]='-----'
)
local sed_commands=()
for char in "${!morse[@]}"; do
sed_commands+=( -e "s/$char/${morse[$char]}\\t/gi" )
done
# let sed consume stdin
sed "${sed_commands[@]}"
}
然后你可以做
$ echo "Hello world" | morse
.... . .-.. .-.. --- .-- --- .-. .-.. -..
答案 1 :(得分:1)
当前的问题(显然是基于注释)你没有将参数传递给你声明的函数(虽然你没有发布调用代码,所以这是模糊的推测)。
但是一个更紧迫的问题是你正在调用.AddRange
为每个字符重写一次整个文件。这是非常可怕的,几乎是犯罪效率低下的,而且根本不是你如何使用sed
。这是流编辑器; 您使用它的方式是使用sed
语言的脚本将其称为一次,您可以在其中指定应对其执行的更改文件。像这样:
sed
一旦您确信脚本的输出或多或少是您所期望的,就添加sed 's/[Aa]/.-\t/g
s/[Bb]/-...\t/g
s/[Cc]/-.-.\t/g
# etc etc
s/ //g' filename
选项;我可能不太了解你的方法的每一个细微差别(特别是在最后,重复替换所有文本文件中每行的第一个空格,你在莫尔斯输出中找到单词的次数,我是否完全得到了它?)
答案 2 :(得分:0)
问题是命令 echo 将 -e 参数作为自己的参数。查看下面的示例,您的论点就在那里并且有效。
echo "all parameters => $*"
if [ "-e" == "$1" ]; then
echo Fora Temer
fi
你应该看到文字:Fora Temer
查看this link以改进参数处理。