2017-04-10 31 views
1

から1を減算/追加:bashスクリプト - これは私が何をしようとしているあるファイル

私はどちらかcounter_use inまたはcounter_use outで呼び出すことができるスクリプトを作りたいです。私が入力する場合in私は "カウンター"と呼ばれるファイル内の数値に+1を追加するカウンタを入力してください、私はout私はファイルから1を引くしたい場合。カウンタが0

Iハードコードカウンタの場合は最後の部分がrunnigさに等しい場合

Iはまた、カウンタの値が等しいかまたは1とNot logged inよりも高い場合に出力Logged inにスクリプトを望ん特定の番号。問題は最初の部分です。

echo "In or out?" 

read input > counterFile 

if grep -q "in" counterFile 
    then //what should I do here so that it adds +1 to a file called 
counter? 

elif grep -q "out" counterFile 
    then //what should I do here so that it subtracts -1 to a file called 
counter? 

if [ $counter -ge 1 ] 
    then 
     echo "Logged in" 

elif [ $counter -eq 0 ] 
    then 
     echo "Not logged in" 

else 
     echo "Wrong input" 

fi 

答えて

1

第1の問題は、readコマンドの使用です。この

read -p "in or out ?" input 
  • -pオプションが
  • stdoutに印刷するために何かをspecifieへの入力は、このコマンドの後ユーザー入力

を保存するシェルスクリプトの変数、入力変数の名前です試してみてくださいinまたはoutになります。 次に、あなたが入力if式でinまたはoutであるかどうかをテストすることができます:カウンターファイル内の値に追加したり、substract 1には

if [ "$input" == "in" ] [...] 

、あなたは、ファイル内の現在値を取得、追加またはsubstract 1と、新しい値を書き込むことができますファイルの中に(私はあなたが新しい値を書きたいかわからない、これを試してみてください:。

crt_val=$(cat ./counter) 
new_val=$((crt_val + 1)) 
echo $new_val > ./counter 

カウンタファイルが存在しなければならないので、スクリプトの先頭で、追加することができます

if [ -e ./counter ] ; then echo "0" > ./counter ; fi 

最後に、コードは、このことができる:

# user entry 
read -p "in or out ? " input 

# initialize counter file 
if [ ! -e ./counter ] ; then echo "0" > ./counter ; fi 

# Doing what user entry ask to do 
if [ "$input" == "in" ] 
then 
    echo "in" 
    crt_val=$(cat ./counter) 
    new_val=$((crt_val + 1)) 
    echo $new_val > ./counter 
elif [ "$input" == "out" ] 
then 
    echo "out" 
    crt_val=$(cat ./counter) 
    new_val=$((crt_val - 1)) 
    echo $new_val > ./counter 
else 
    echo "Wrong input, try in or out" 
    exit 1 
fi 

# Output 
if [ $new_val -ge 1 ] 
then 
    echo "Logged in" 
elif [ $new_val -eq 0 ] 
then 
    echo "Not logged in" 
else 
    echo "Wrong counter value" 
fi 

気をつけ、ユーザのエントリでは、正確inまたはout(大文字と小文字を区別)でなければならない、と全く空でない必要があります。空の答えを保護するために、if [ "x$input" == "xin" ] [...]

希望をしてみてください。このヘルプ

0
#!/bin/bash 


echo "In or out?" 

read c <&0 # reads from stdin file descriptor &0 is stdin 

if [[ $c == 'In' ]] || [[ $c == 'in' ]]; 
then 
counter=$(<counter.txt) # reads counter from file 
let "counter = counter +1" # increases variable 
echo "$counter" > 'counter.txt' # write new value to file overwriting the old 
elif [[ $c == 'Out' ]] || [[ $c == 'out' ]]; 
then 
counter=$(<counter.txt) # reads from file 
let "counter = counter -1" 
#echo "$counter" > 'counter.txt' 
else 
echo "wrong input..." 
fi 

Write to file, but overwrite it if it exists

https://askubuntu.com/questions/385528/how-to-increment-a-variable-in-bash/706683

http://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php

+0

競合状態があるため、これは実際には信頼性がありません。更新中にカウンタファイルをロックする必要があります。 – user1934428

+0

あなたはこれを説明できますか? –

+0

カウンタファイルを読み込み、後で更新されたカウンタファイルを書き出します。 2つ目のプロセスがこのスクリプトを同時に実行すると、読者と読者の間でカウンタファイルを読み取ることができるため、更新された値はまだ表示されません。 – user1934428

2

romaric crailox's helpful answerは、多くの有用なポインタが含まれていますが、コードがなるために合理化することができますより慣用的な(Bash)ソリューション:

#!/bin/bash 

# Create the counter file on demand. 
[[ -f counter ]] || echo 0 > counter 

# Prompt until valid input is received. 
while read -p 'In or out? ' input; do 

    case $input in 
    'in') 
     # Update the counter file by incrementing the number it contains. 
     perl -i -ple '++$_' counter 
     break # valid input received, exit the loop 
     ;; 
    'out') 
     # Update the counter file by decrementing the number it contains. 
     perl -i -ple '--$_' counter 
     break # valid input received, exit the loop 
     ;; 
    *) 
     echo "Invalid input." >&2 # echo error to *stderr* 
     # Stay in the loop to prompt again. 
     ;;  
    esac 

done 

# Read the updated counter file and echo the implied status. 
counter=$(< counter) 
if ((counter >= 1)); then 
    echo 'Logged in.' 
elif ((counter == 0)); then 
    echo 'Not logged in.' 
else 
    echo "Invalid state: counter is $counter" >&2 
fi 

注:

  • より簡潔if ... elif ... fi声明よりも、複数の条件を処理するためcase ... esacの使用。

  • 場所にファイルcounterを更新するperlコマンドの>&2

  • 使用して標準エラー出力にエラーメッセージを出力する:

    • -iを活性化しその場で自動的に
    • -plep rintsを更新(変更された)入力行、-lはintellを追加します次いでigent改行の取り扱い、及び-e(次の引数)を実行するe XPRESSION(スクリプト)を指定
    • ++$_/--$_は単にインクリメント/ -pのおかげで、自動的に出力を取得し、手で入力ライン($_)は、デクリメント-iのおかげで元のファイルに書き戻されました。オリジナルを置き換える新しいファイルが作成されます)。
  • 数字のテストには算術評価(((...)))を使用します。

+1

この良いソリューションありがとう –

関連する問題