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!
任意のヒント?助言がありますか?
ありがとう!
ここでスクリプトが機能しています。報告する同じエラーを生成する唯一の方法は、変数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!
これは、ファイル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以降で使用可能です。