用户输入数组在bash中反转

时间:2016-08-01 10:12:45

标签: arrays bash

我想从用户那里获取输入并将它们存储在一个数组中,并反转该数组。

例如:如果我输入“我是初学者”,它必须显示“rennigbe a ma i”。这是我的代码。

此代码中唯一的问题是它只反转字符串,而不是完整数组。

例如,我输入了“windows”。它显示“swodniw”。但是当我输入“我是初学者”时,它只显示“我”。

为什么?我不熟悉bash。请帮帮我。

#!/bin/bash
echo "type:"
read -a input
for a in ${input[@]}
do 
echo "you typed:$a"
done

len=${#input}
for (( i=$len-1; i>=0; i-- ))
do
    reverse="$reverse${input:$i:1}"
done

echo "$reverse"

4 个答案:

答案 0 :(得分:0)

您读入数组,但只处理第一个元素。你需要另一个循环。

TBH,删除-a会更容易。

答案 1 :(得分:0)

最佳解决方案是使用rev。但是,如果您不限于数组。可以使用。

echo windows | awk -v FS="" '{for(i=NF;i>=1;--i) if(i==1) printf $i"\n";else printf $i }'
swodniw

    echo "i am a beginner" | awk -v FS="" '{for(i=NF;i>=1;--i) if(i==1) printf $i"\n";else printf $i }'
    rennigeb a ma i

答案 2 :(得分:0)

试试这个;

#!/bin/bash
echo "type:"
read -a input
for a in ${input[@]}
do 
echo "you typed:$a"
done

rev<<<${input[@]}

答案 3 :(得分:0)

根据您对要求的描述,听起来您需要撤消字符串,而不是数组"i am a beginner"看起来很像bash字符串,尽管可以将其表示为字符串数组,例如declare -a array_of_strings=(I am a beginner);存储一个数组,每个单词有一个字符串,甚至是一个单字符串数组,例如declare -a array_of_chars=('i' ' ' 'a' 'm' ' ' 'a' ' ' 'b' 'e' 'g' 'i' 'n' 'n' 'e' 'r');存储一个数组,每个字符包含一个字符串。

给定read选项时-a内置函数的行为是将输入行拆分为空格(更确切地说,将$IFS中的字符作为分隔字符)并存储命名数组变量中的结果单词。因此,您将获得我在前一段中显示的$array_of_strings的等价物。

输入的这种表示的问题是你必须遍历每个单词中的数组单词和字符。这将需要两个循环。

其他说明:

  • 对于名为input的数组变量,检索数组中元素数的正确语法是${#input[@]}。语法${#input}只检索数组第一个元素的字符串长度,这不是你想要的。
  • 使用read内置版时,您可能想要传递-r选项以防止输入的反斜杠插值。
  • 使用内置read时,如果需要提示,则应使用-p选项获取光标左侧的固定提示。

以下是我们如何使用数组和双循环实现此任务:

read -r -p 'type: ' -a input;
for a in "${input[@]}"; do
    echo "you typed:$a";
done;

inputRev=();
for ((i = ${#input[@]}-1; i >= 0; --i)); do
    word="${input[i]}";
    wordRev='';
    for ((j = ${#word}-1; j >= 0; --j)); do
        wordRev+="${word:j:1}";
    done;
    inputRev+=("$wordRev");
done

echo "${inputRev[@]}";

演示(使用名为script2的脚本):

./script2 <<<'i am a beginner';
## you typed:i
## you typed:am
## you typed:a
## you typed:beginner
## rennigeb a ma i

但是,正如我之前所说,使用字符串而不是数组更有意义。以下是我们如何实现这一点:

read -r -p 'type: ' input;
echo "you typed:$input";

inputRev='';
for ((i = ${#input}-1; i >= 0; --i)); do
    inputRev+="${input:i:1}";
done

echo "${inputRev[@]}";

演示(使用名为script3的脚本):

./script3 <<<'i am a beginner';
## you typed:i am a beginner
## rennigeb a ma i

对您的评论的回复:当您从代码中删除-a时,脚本的行为会跟随我的两个演示融合。让我解释。首先,删除-a会导致bash将整行(减去任何前导/尾随空格)读作$input作为字符串变量,数组变量。这就像我的第二个演示。并且因为代码中的最后一个循环等同于我的第二个演示中的最后一个循环,所以反转完美且相同,将$input作为字符串变量处理。

you typed:删除的代码与我的第一个演示之间的-a输出行显示相同的原因是您没有在初始版本中正确扩展$input字符串变量-环。您已经使用了${input[@]},当您愿意允许分词对它们生效时,您应该如何扩展数组变量。当您不想希望分词对数组变量生效时,您应该引用扩展名,即"${input[@]}"。但是在这里,因为$input是一个字符串变量,所以你不应该使用任何一种形式。相反,您应该将其展开为"$input",这是如何扩展字符串变量而不进行分词。另外,请注意,如果不对引号进行双引号(即$input),则会导致分词,就像${input[@]}一样。你使用${input[@]}$input工作的方式工作的原因是,当你尝试将字符串变量扩展为数组变量时,它只是扩展为字符串值,与{ {1}}有效。