4

次のような状況があります。

#!/bin/bash

echo "Please enter a word:"
read foobar

スクリプトはsh script.shUbuntu ターミナルで呼び出されています。
私が見つけた解決策をインターネットで検索しています:

foobar=${foobar,,}
echo $foobar

上記のアプローチはでのみ機能するbash script.sh
ので、調査を続けて見つけました:

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

bashとの両方で実際に機能しますshが、エコーがないと機能しません。
また、読み取り入力を 1 回ではなく 2 回出力します:
Y
y

shでは、読み取り入力を2回印刷せずにこれを行うにはどうすればよいですか?

4

1 に答える 1

7

おそらく、翻訳された出力をまだ変数に割り当てていないことが原因です。また、単語の分割やパス名の拡張を防ぐために、変数を二重引用符で囲むことをお勧めします。

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

使用していてcase、入力がどちらの方法であるかを確認する必要がある場合は、yこのYような glob パターンを使用できます。小文字に音訳する必要はありません。

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

また、-s を使用して、ユーザー入力の表示を何らかの形で抑制することもできます。

read -s foobar

全体として、コードを両方でうまく機能させるには、bash 固有の部分を既に削除する必要がbashあります。sh

#!/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
于 2013-09-14T12:25:54.970 に答える