ファイルを1行ずつ読み取るための次のスクリプトがあります。
_PATH=$(pwd)
LOCATION_PATH="$_PATH/inventory.sh"
LETTER="l"
while IFS='' read -r line || [[ -n "$line" ]]; do
echo $line >> file2.test
CALL="${LOCATION_PATH} ${line} ${LETTER} 1234"
echo $CALL >> file.test
echo =========
RESULT=$($CALL)
#echo $RESULT
done < "$1"
ただし、各行の入力ファイル^M
には(キャリッジリターン)文字はありませんが、file.testファイルの出力には次のような文字が含まれています。
/.../inventory.sh 00000e99-bce9-11e4-8418-06e8ce2b06d8^M l 1234
/.../inventory.sh 0001688b-bce7-11e4-8418-06e8ce2b06d8^M l 1234
file2.testの出力にも^M
文字がありません。
次を交換してみました。
SP=" "
LE="l"
...
CALL="${LOCATION_PATH}${SP}${line}${SP}${LE}${SP}1234"
役に立たない。
答え1
^MはWindowsの行終端であるため、$ {line}変数を指定してWindowsが入力データを生成したことを意味します。 Windowsで編集したファイルをLinuxに転送する場合は、Unix / Linuxで使用する前に「dos2unix」コマンドを実行する必要があります。
このような場合を確認するには、入力ファイルで "od -Xc"コマンドを実行して16進数でダンプし、改行の代わりにキャリッジリターン/改行を見つけます。 \n の代わりに \r\l のような文字が表示された場合、犯人を見つけたのです。