したがって、Macでこのコードを実行してもエラーは発生せず、完璧な出力が得られます。しかし、UbuntuまたはCentOSで実行すると、次のエラーが発生しますinteger expression expected
#!/bin/bash
if [ -f $1 ] ;
then
sum=0
echo "#Name Surname City Amount"
while read -r LINE || [[ -n $LINE ]]; do
firstName=$( echo $LINE | cut -d " " -f1)
lastName=$( echo $LINE | cut -d " " -f2)
city=$( echo $LINE | cut -d " " -f3)
amount=$( echo $LINE | cut -d " " -f9)
check=$( echo $amount | grep -c "[0-9]")
if [ $check -gt 0 ]; then
if [ $amount -gt 999 ] ; then
state=$(echo $LINE | cut -d " " -f5)
correctState=$(echo $state | grep -c "^N[YCEJ]")
if [ $correctState -gt 0 ] ; then
echo "$firstName $lastName $state $city $amount"
sum=`expr $sum + $amount`
fi
fi
fi
done < $1
echo ""
echo "The sum is all printed amounts is $sum"
echo ""
else
echo "No file found"
fi
入力ファイル:
#Name Surname City Company State Probability Units Price Amount
Tony Passaquale Edenvale "Sams_Groceries_Inc. NJ 90 800 4.78 3824
Nigel Shanford Atlanta Fulton_Hotels_Inc. GA 40 400 9.99 3996
Selma Cooper Eugene Cooper_Inns OR 40 1000 9.99 9990
Allen James San_Jose City_Center_Lodge CA 40 1000 9.99 9990
Bruce Calaway Irvine Penny_Tree_Foods CA 80 1000 4.99 4990
Gloria Lenares Chicago Cordoba_Coffee_Shops IL 60 200 9.99 1998
Wendy Leach New_York Gourmet_Imports NY 100 100 10 1000
Craig Flanders Omaha Fly_n_Buy NE 40 1200 9.49 11388
Montgomery Weissenborn Chicago Shariott_Suites_Hotels IL 60 400 7.98 3192
Shirley Brightwell San_Francisco Pacific_Cafe_Company CA 80 2900 1.75 5075
Roger Vittorio Cleveland National_Associa OH 40 1000 9.99 9990
Tony Passaquale Edenvale Sams_Groceries NJ 90 1000 2.29 2290
Montgomery Weissenborn Los_Angeles Shariott_Suites_Hotels CA 90 5000 1.49 7450
Michael Wiggum Los_Angeles Trader_Depot CA 70 800 2.5 2000
Edna Brock Raleigh Elliott's_Department_Stores NC 70 14400 1.78 25632
Gloria Lenares Chicago Cordoba_Coffee_Shops IL 90 600 8.99 5394
Montgomery Weissenborn Seattle Shariott_Suites_Hotels WA 90 400 8.99 3596
Beth Munin Seattle Little_Corner_Sweets WA 100 400 1.39 556
Tim Kelly New_York Nuts_and_Things NY 60 100 9.99 999
Bart Perryman San_Francisco Kwik-e-mart CA 90 40000 0.69 27600
Stacey Gordon Irvine Penny_Tree_Foods CA 70 200 12.96 2592
Heather Willis Atlanta Big_Chuck_Diners GA 80 400 4.99 1996
Tim Kelly New_York Nuts_and_Things NY 70 600 1.49 894
Ralph Khan New_York Gigamart NY 30 600 9.99 5994
Joshua Newsom New_York Trader_Depot NY 90 800 7.99 6392
Edna Brock Raleigh Elliott's_Department_Stores NC 90 9200 1.88 17296
Edna Brock Raleigh Elliott's_Department_Stores NC 100 4400 1.98 8712
Michael Wiggum Los_Angeles Trader_Depot CA 100 600 2.5 1500
Joshua Newsom New_York Trader_Depot NY 90 600 2.5 1500
Edna Brock Raleigh Elliott's_Department_Stores NC 100 8800 1.68 14784
Heather Willis Atlanta Big_Chuck_Diners GA 100 200 4.99 998
Beth Munin Seattle Little_Corner_Sweets WA 100 200 2.49 498
Shirley Brightwell San_Francisco Pacific_Cafe_Company CA 100 1200 1.89 2268
Tim Kelly New_York Nuts_and_Things NY 90 14000 2.29 32060
出力(予想)これはMacでのみ機能します
#Name Surname City Amount
Tony Passaquale NJ Edenvale 3824
Wendy Leach NY New_York 1000
Craig Flanders NE Omaha 11388
Tony Passaquale NJ Edenvale 2290
Edna Brock NC Raleigh 25632
Ralph Khan NY New_York 5994
Joshua Newsom NY New_York 6392
Edna Brock NC Raleigh 17296
Edna Brock NC Raleigh 8712
Joshua Newsom NY New_York 1500
Edna Brock NC Raleigh 14784
Tim Kelly NY New_York 32060
The sum is all printed amounts is 130872
出力(UbuntuまたはCentOSXの場合)
#Name Surname City Amount
: integer expression expected
: integer expression expected
: integer expression expected
./script.sh: line 13: [: 9.99: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
: integer expression expected
The sum is all printed amounts is 0
: integer expression expected
が表示されている場合は、:
の前が carriage return 文字で終わっていることを示しています。キャリッジリターンにより、ターミナルは現在の行を後続のテキストで上書きするため、フィールドに1234␍
のようなものが含まれている場合、␍
はキャリッジリターンであり、シェルはエラーメッセージ1234␍: integer expression expected
を表示します、および1234
は: in
によって上書きされます。
入力ファイルがWindowsテキストファイルであり、これが行の最後のフィールドであるため、キャリッジリターンが発生します。 LinuxまたはCygwinでファイルを使用するには、Unixテキストファイルに変換する必要があります。 Windowsテキストファイルは、2文字のシーケンスCR-LF(復帰、改行)を使用して、行の終わりを示します。 Unixテキストファイルは、1文字のLFを使用します。したがって、LinuxがWindowsテキストファイルを見ると、各行がCR文字で終了していることがわかります。これは、有効な文字ですが、めったに望ましい文字ではなく、整数の有効な文字ではありません。
メッセージ9.99: integer expression expected
は、9.99
が9番目のフィールドにある行があることを示しています。サンプルデータから、これは8番目のフィールドで予期されているように見えるため、不良データの行があります(おそらく、名前フィールドの1つである誤ったスペース)。
あなたのスクリプトは非常に面倒です。引数が通常のファイルであるかどうかを確認しないでください。これは有用な目的に使用できず(ファイルが存在しない場合、リダイレクトは失敗します)、パイプを入力として使用できなくなります。フィールドの解析にcut
を使用しないでください:read
はそれを実行できます(空のフィールドがない場合)。 || [[ -n $LINE ]]
フラグメントは、有用なことは何もしません(ただし、入力が有効なテキストファイルであることを確認してください。空でない有効なテキストファイルでは、最後の文字はLFです)。 expr
の代わりにシェル演算を使用します。一般的な原則として、 変数の置換を二重引用符で囲みます (ここでは有効なデータでは問題になりませんが、誰かがフィールドに*
を書き込んだ場合にどうなるかを検討してください)。テストされていない書き換え:
#!/bin/bash
set -e
sum=0
echo "#Name Surname City Amount"
while read -r firstName lastName city f4 state f6 f7 f8 amount; do
if [ "$amount" -gt 999 ] ; then
case "$state" in
N[YCEJ])
echo "$firstName $lastName $state $city $amount"
sum=$((sum + amount));;
esac
fi
done < "$1"
echo ""
echo "The sum is all printed amounts is $sum"
echo ""
これはawkスクリプトとして完全に簡単です。再び、テストされていません。
awk '
$9 > 999 && $5 ~ /^[N[YCEJ]]$/ {
print $1, $2, $5, $3, $9;
sum += $9;
}
END { print "\nThe sum is all printed amounts is " sum }
' <"$1"
#!/bin/bash
if [ -f $1 ] ;
then
sed 's/^M$//' $1 > $1.txt
total=0
amount=0
echo "#Name Surname City Amount"
while read -r LINE || [[ -n $LINE ]]; do
firstName=$( echo $LINE | cut -d " " -f1)
lastName=$( echo $LINE | cut -d " " -f2)
city=$( echo $LINE | cut -d " " -f3)
amount=$( echo $LINE | cut -d " " -f9)
check=$( echo $amount | grep -c "[0-9]")
if [ $check -gt 0 ]; then
#echo $amount
checkAmount=$( echo "$amount > 999" | bc)
state=$(echo $LINE | cut -d " " -f5)
correctState=$( echo $state | grep -c "^N[YCEJ]" )
if [ $checkAmount -gt 0 ] && [ $correctState -gt 0 ] ; then
echo "$firstName $lastName $state $city $amount"
total=`expr $total + $amount`
fi
fi
done < $1
echo ""
echo "The sum is all printed amounts is $total"
echo ""
else
echo "No file found"
fi
キャリッジリターン文字(不明)をすべて削除し、必要に応じてそれを機能させることができました。