【问题标题】:Converting read variables to lowercase in sh on ubuntu在ubuntu上的sh中将读取变量转换为小写
【发布时间】:2013-09-19 01:11:08
【问题描述】:

我有以下情况:

#!/bin/bash

echo "Please enter a word:"
read foobar

在 Ubuntu 终端中使用 sh script.sh 调用脚本。
在互联网上搜索我找到的解决方案:

foobar=${foobar,,}
echo $foobar

上述方法仅适用于bash script.sh
于是我继续研究,发现:

echo $foobar | tr '[:upper:]' '[:lower:]'

这确实适用于bashsh,但没有回显它不起作用。
它还会将读取的输入打印两次,而不是像这样打印一次:
是的
是的

那么如何在不打印两次读取输入的情况下为sh 执行此操作?

【问题讨论】:

  • 非常适合我。使用破折号(ubuntu12.04 上的 sh)和 bash
  • 你有一个#!/bin/bash shebang 但想用sh 调用你的脚本?
  • @gniourf_gniourf 是的,我知道这很奇怪。但是在使用./script.sh 调用脚本时,在它的权限设置为可执行后,我得到了相同的结果。
  • 另一种 bash 方法:declare -l foobar: read -p "Please enter a word:" foobar

标签: bash shell sh ubuntu-12.04 lowercase


【解决方案1】:

这可能是因为您尚未将翻译后的输出分配给变量。另外我建议在双引号周围引用你的变量,以防止分词和路径名扩展。

foobar=$(echo "$foobar" | tr '[:upper:]' '[:lower:]')

如果您使用的是case,并且您只需要检查输入是y 还是Y,无论哪种方式,您都可以使用这样的全局模式。无需将其音译为小写形式。

case $foobar in
[yY])
    echo "User said yes."
    ;;
*)
    echo "User said no."
    ;;
esac

您还可以使用 -s 以某种方式抑制显示用户输入:

read -s foobar

作为一个整体,为了让您的代码在 bashsh 中都能正常工作,您应该已经删除了特定于 bash 的部分:

#!/bin/bash
echo "Please enter a word:"
read -s foobar
foobar=$(echo "$foobar" | tr '[:upper:]' '[:lower:]')
echo "$foobar"

如果只是显示较小的表格,您可以跳过作业。但不要同时使用另一个回声:

#!/bin/bash
echo "Please enter a word:"
read -s foobar
echo "$foobar" | tr '[:upper:]' '[:lower:]'

case 的另一种替代形式。这意味着与 POSIX 兼容。

if [ "$foobar" = y ] || [ "$foobar" = Y ]; then
    echo "User said yes."
else
    echo "User said no."
fi

在 bash 中可能只是这样。它甚至可以在不支持${parameter,,} 功能的早期版本中工作。

if [[ $foobar == [yY] ]]; then
    echo "User said yes."
else
    echo "User said no."
fi

【讨论】:

  • 这会将输入打印两次。
  • 好的,案例解决方案有效!在 if else 情况下是否有类似的情况?
  • 好的,我知道了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
相关资源
最近更新 更多