linux - read -a 在 Bash 中没有按预期工作

标签 linux bash ubuntu

出于某种原因,当使用“read -a”时,我的脚本只将行的第一个元素放入数组中。例如,当输入“canada China”这样的字符串时,程序的输出只是:

canada
c
Canada changed to uppercase.

代替:

canada China
c
Canada Changed to uppercase.
C
China Already uppercase.

我的作业说明如下:

创建一个脚本来读取用户的输入并将其存储在一个数组中。然后,遍历数组并:

  • 如果第一个字符是小写,将其改为大写并在其旁边写上“Changed to uppercase”。
  • 如果第一个字母已经大写,输出输入的单词然后在它旁边写上“Already uppercase”。
  • 如果第一个字符不是字母,则输出输入的单词,然后在其旁边写上“Doesn't Start with a letter”。 使用关联数组将小写字母转换为大写字母 [converterArray=([a]=A [b]=B …)]

这是我的代码:

#!/bin/bash

declare -A converterArray
converterArray=([a]=A [b]=B [c]=C [d]=D [e]=E [f]=F [g]=G [h]=H [i]=I [j]=J [k]=K [l]=L [m]=M [n]=N [o]=O [p]=P [q]=Q [r]=R [s]=S [t]=T [u]=U [v]=V [w]=W [x]=X [y]=Y [z]=Z)

read -p "Enter elements separated by space, return to end: " -a inputArray

lowercasemsg=" Changed to uppercase."
uppercasemsg=" Already uppercase."
notlettermsg=" Doesn't start with a letter."

echo $inputArray

for word in $inputArray; do
    firstchar=${word:0:1}
    echo $firstchar

    case $firstchar in 
    [a-z]*)
        word = ${converterArray[$firstchar]}${word:1}
        echo $word$lowercasemsg
        ;;
    [A-Z]*)
        echo $word$uppercasemsg
        ;;
    *)
        echo $word$notlettermsg
        ;;
    esac

done

编辑:感谢 John 的帮助,问题已经解决。我还解决了检查字母大小写的问题([a-z] 与 [[:lower:]]),并删除了不必要的“echo ”以进行调试。

#!/bin/bash

declare -A converterArray
converterArray=([a]=A [b]=B [c]=C [d]=D [e]=E [f]=F [g]=G [h]=H [i]=I [j]=J [k]=K [l]=L [m]=M [n]=N [o]=O [p]=P [q]=Q [r]=R [s]=S [t]=T [u]=U [v]=V [w]=W [x]=X [y]=Y [z]=Z)

read -p "Enter elements separated by space, return to end: " -a inputArray

lowercasemsg=" Changed to uppercase."
uppercasemsg=" Already uppercase."
notlettermsg=" Doesn't start with a letter."

for word in "${inputArray[@]}"; do
    firstchar=${word:0:1}

    case $firstchar in 
    [[:lower:]]*)
        inputString=${converterArray[$firstchar]}${word:1}
        echo $word$lowercasemsg
        ;;
    [[:upper:]]*)
        echo $word$uppercasemsg
        ;;
    *)
        echo $word$notlettermsg
        ;;
    esac

done

(第二次编辑:修复了我忘记在等号周围放置空格的行,最初在之前的编辑中忘记了)

最佳答案

如果 $array 是一个数组,"${array[@]}" 给出所有的数组元素。裸 $array 仅引用第一个元素。

echo "${inputArray[@]}"

for word in "${inputArray[@]}"; do
    ...
done

关于linux - read -a 在 Bash 中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40269181/

相关文章:

linux - 如何使用linux命令列出包含特定字符串的文件

linux - 在 WSL 2 上使用 Ansible 通过 snap 安装 microk8s

java - 如何为mondrian pentaho启动tomcat webapp

windows - Ghostscript On Windows 导致 -dPDFSETTINGS 选项无效

bash - 错误代码编号。定义适当的值

ubuntu - 在视频中添加超链接

ubuntu - 如何更改默认的 upstart 日志目录?

linux - 是否可以在两个 perforce 存储库之间创建链接?

php - 如何在ssh中使用pid查看正在运行的后台任务

linux - 在 bash 中使用带有命令的变量