") 構文エラー 無効な算術演算子("で示されるエラー)

スクリプトでコマンドを使用して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!

どのようなヒントがありますか?どんな提案がありますか?

ありがとうございます!

ベストアンサー1

スクリプトはここで実行されます。報告したのと同じエラーが発生する唯一の方法は、変数に次のものをdb_ctdy_sr含めることですnew 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!

ファイルにDOSキャリッジリターン文字が含まれていると、db_count.iniこの現象が発生する可能性があります。

実装する:

$ 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から利用可能です。

おすすめ記事