web-dev-qa-db-ja.com

Zenityファイル選択の使用方法

私はzenityが初めてで、zenity --file-selectionwcコマンドを使用してファイルをロードし、そのファイルのワードカウントを取得するための簡単なスクリプトを作成しようとしています。ファイルの閲覧に使用できるフォームを作成しましたが、出力を取得できません。間違いを犯している場所を教えてください。

私の現在のスクリプトは次のとおりです。

#creates a box

if zenity --entry \
--title="Word count" \
--text="Enter file location" \
--entry-text "File path"

  then
#Zenity file selection code for browsing and selecting files

FILE=`zenity --file-selection --title="Select a File"`
case $? in
         0)
                echo "\"$FILE\" selected.";;
         1)
                echo "No file selected.";;
        -1)
                echo "An unexpected error has occurred.";;
esac

# To show the location in the text box

if zenity --entry \
--title="Word count" \
--text="Enter file location" \
--entry-text "$FILE"
then

#Word counting code

Word_count='wc $FILE'
zenity --info --title="Word Counted" --text="Counted words $Word_count"
fi
fi
7
Eka

コマンドの出力を変数に保存するには、コマンドをバックティックス(`command`)で囲むか、$()$(command))で囲む必要があります。一重引用符を使用しているため、stringwc $FILEを保存し、実際にはwcを実行していません。

$ foo='wc /etc/fstab' ## WRONG
$ echo $foo
wc /etc/fstab

$ foo=`wc /etc/fstab`  ## RIGHT
$ echo $foo 
23 96 994 /etc/fstab

$ foo=$(wc /etc/fstab)   ## RIGHT
$ echo $foo 
23 96 994 /etc/fstab

さらに、文字数と行数ではなく単語のみを取得するには、-wオプションを使用します。

$ foo=$(wc -w /etc/fstab)   
$ echo $foo 
96 /etc/fstab

最後に、ファイル名なしで番号のみを取得するには、次を使用できます。

$ foo $(wc -w /etc/fstab | cut -d ' ' -f 1 )
$ echo $foo
96
9
terdon

私は正しいコードがこれであると思う:

#!/bin/bash

function count() {
  Word_count=$(wc -w < "$FILE")
  zenity --info --title="Word Counted" --text="Counted words $Word_count"
}

function choose() {
  FILE="$(zenity --file-selection --title='Select a File')"
  case $? in
           0)
                  count;;
           1)
                  zenity --question \
                         --title="Word counter" \
                         --text="No file selected. Do you want to select one?" \
                         && choose || exit;;
          -1)
                  echo "An unexpected error has occurred."; exit;;
  esac
}

choose
5
Helio