2017-12-08 26 views
0

データファイルにアクセスするプログラムをUnixに作成しようとしています。ファイル内で名前とユーザー名を追加、削除、検索しています。このifステートメントでは、ユーザーが最初のフィールドでファイル内のデータを検索できるようにしようとしています。ユーザー入力を大文字に変換する

ファイル内のすべてのデータには大文字が使用されているため、まずユーザー入力のテキストを小文字から大文字に変換する必要があります。なんらかの理由で、このコードは大文字に変換したり、データを検索して印刷したりすることはできません。

どうすれば修正できますか?

if [ "$choice" = "s" ] || [ "$choice" = "S" ]; then 
     tput cup 3 12 
     echo "Enter the first name of the user you would like to search for: " 
     tput cup 4 12; read search | tr '[a-z]' '[A-Z]' 
     echo "$search" 
     awk -F ":" '$1 == "$search" {print $3 " " $1 " " $2 }' 
     capstonedata.txt 
fi 
+1

私はいくつかのサンプルデータと予想される出力を追加すると便利だと思う。そして、「このコードは機能していません」ということを意味します。 – dan08

+0

次の行にファイル名を入力すると思いますか? "awk -F": "$ 1 ==" $ search "{print $ 3" "$ 1" "$ 2}" capstonedataあなたはコマンドとして扱うには最後に ' .txt'。それ以外の場合は、別々のコマンドとして扱います。 – Ben

+0

あなたは '検索を読みたいです。 = $(echo "$ search" | tr '[a-z]' '[A-Z]'; ... 'と' awk -v srch = "$ search" '{...} '。 – shellter

答えて

3

この:read search | tr '[a-z]' '[A-Z]'は変数searchには何も割り当てられません。

それは

read input 
search=$(echo "$input" | tr '[a-z]' '[A-Z]') 

のようなものであるべきで、case modification用パラメータ展開を使用することをお勧めし:

read input 
search=${input^^} 
3

あなたがバッシュを使用する場合は、大文字に変換するための変数を宣言することができます。

$ declare -u search 
$ read search <<< 'lowercase' 
$ echo "$search" 
LOWERCASE 

コードの場合、readにはouがありませんtputのため、trへのパイプラインは何もせず、awkステートメントのファイル名の前に改行を入れることはできません。

あなたのコードの

編集されたバージョン、マイナスのすべてのtputもの:

# [[ ]] to enable pattern matching, no need to quote here 
if [[ $choice = [Ss] ]]; then 

    # Declare uppercase variable 
    declare -u search 

    # Read with prompt 
    read -p "Enter the first name of the user you would like to search for: " search 
    echo "$search" 

    # Proper way of getting variable into awk 
    awk -F ":" -v s="$search" '$1 == s {print $3 " " $1 " " $2 }' capstonedata.txt 
fi 

また、あなたが唯一のPOSIXシェルの構文を使用する場合:

case $choice in 
    [Ss]) 
     printf 'Enter the first name of the user you would like to search for: ' 
     read input 
     search=$(echo "$input" | tr '[[:lower:]]' '[[:upper:]]') 
     awk -F ":" -v s="$search" '$1 == s {print $3 " " $1 " " $2 }' capstonedata.txt 
    ;; 
esac 
1

awkが(それをグーグル)シェルされていません。ただしてください:

if [ "$choice" = "s" ] || [ "$choice" = "S" ]; then 
     read search 
     echo "$search" 
     awk -F':' -v srch="$search" '$1 == toupper(srch) {print $3, $1, $2}' capstonedata.txt 
fi 
関連する問題