参数未显示在bash脚本中

时间:2018-01-08 17:01:21

标签: linux bash shell sh

所以我必须为一个项目制作一个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
}

以前有人遇到过这个问题吗?

3 个答案:

答案 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以改进参数处理。