web-dev-qa-db-ja.com

")構文エラー無効な算術演算子(エラートークンは"

bashスクリプトにコマンドがあり、ソーステキストファイルからデータを取得し、それに変数の値を追加して、if/else条件で使用しています。

ソースデータファイル(db_count.ini)(注:二重引用符の内側にスペースが含まれています):

db_ctdy_sr=" 7"

脚本:

source db_count.ini

# Removing the whitespace on the stored data
n_db_sr=${db_ctdy_sr// /}

# Sum
c=0
b=7

echo "Value of db:"$n_db_sr

sm=$((n_db_sr + c))

echo "The value of db:"
echo "$sm" 
echo $sm 

if [ "$sm" = "$b" ]
then
   echo "Success."
else
   echo "Not."
fi

echo "Bye!"

しかし、スクリプトを実行すると、常にこれが

The value of db:7
") Syntax error Invalid arithmetic operator (error token is "
The value of:


Not.
Bye!

任意のヒント?助言がありますか?

ありがとう!

4
Edmhar

ここでスクリプトが機能しています。報告する同じエラーを生成する唯一の方法は、変数db_ctdy_srnew lineを含めることです。

新しい行を追加します。

source db_count.ini
db_ctdy_sr=$' 7\r'

次に、スクリプトをテストします。

$ ./so

Value of db:7
")syntax error: invalid arithmetic operator (error token is "
The value of db:
 //test if working
//test if working
Not.
Bye!

これは、ファイルdb_count.iniにDOSの改行文字が含まれている場合に発生する可能性があります。

実行:

$ sed -n l db_count.ini
db_ctdy_sr= 7\r$

(または同様の)ファイル内の\rを確認します。

ファイルを編集して失敗した文字を削除するか、次の行を変更して、改行を削除します。

n_db_sr=${db_ctdy_sr// /}

に:

n_db_sr=${db_ctdy_sr//[ $'\r'}]}

または、すべての制御文字を削除するためのより一般的な方法:

n_db_sr=${db_ctdy_sr//[ $'\001'-$'\037']}

照合順序によって、ASCII値の意図した順序が1(8進数の001)から31(8進数の037)に変更されないようにするには、bash変数を設定します。

shopt -s globasciiranges

Bashバージョン4.3以降で使用可能です。

3
user79743