行の読み取り中に予期しないトークン「完了」の近くに構文エラーが発生しました。

行の読み取り中に予期しないトークン「完了」の近くに構文エラーが発生しました。

このエラーは引き続き発生しますsyntax error near unexpected token 'done'が、理由を理解できません。

dos2unix *.sh後で追加しようとしましたが、#!/bin/sh「完了」エラーに加えて、そのファイルやディレクトリがないというエラーのみが表示されました。

これは .sh ファイルです。私はスクリプトに初めて触れました。助ける?

私は走っている

sh thisfile.sh プログラム入力入力

Linuxで

編集する変数の周りに引用符を追加しました。同じエラー

#!/bin/sh
fst=$1
input=$2
while read line
do
    result=$(cat "$line" | program "$fst")
    if [ "$result" = "" ];
    then
        printf "$line\t=>\t *none* 0\n"
    else
        printf "$line\t=>\tyes\n"
    fi
done < "$input"

「$input」は、「they」「can」「fish」「they」「can」「take」「table」のような4行の単語です。

実行するとcat "$line" | program "$fst"うまくいった。

ノートループ内のすべてを取り出し、printf $ lineだけを使用すると、同じ「完了」構文エラーが発生します。

答え1

syntax error near unexpected token 'done'doneBashが予約語の前に一致するものがない場合に発生するエラーです。do引用符とは何の関係もありませんが、おそらくDOS / WindowsスタイルのCRLF行末を持つファイルとは多くの関係があります。シェルはキャリッジリターン文字(CR、\r)を通常の文字として扱うため、予約語は表示されず、代わりに表示されdoますdo\r。一方、最後の行ではdone行末と区別され、CRもその空白で区切られているため認識します。

スクリプトファイル自体を実行しますdos2unix。追加されたdos2unixコマンドはありません存在するスクリプトファイル。

答え2

私は使用します

#!/bin/sh
program_input="$1"
input="$2"
cat "$input" | while read line
do
    result=$(echo "$line" | program -sli "$program_input")
    if [ "$result" = "" ] 
    then
        printf "$line\t=>\t *none* 0\n"
    else
        printf "$line\t=>\tyes\n"
    fi
done
  • result=$( ... )結果より良い= ...(バックティック)

注文する

echo -e `"$line"\t=>\tyes`

方法:

  • 実装する"$line"\t=>\tyes
  • "$line" =出力を次にリダイレクトyes
  • (結果は空でなければならずecho -e whatever result、stdoutはyesとしてキャプチャされたりstderrはキャプチャされません。)

あなたが欲しいものは何ですか?

純粋主義者は、猫を無駄に使用することに反対するかもしれません。

cat "$input" | while read file
do

done

に取り替えることができる

while read file
do

done < "$input"

しかし、whileループに行が多すぎると、whileが何を読んでいるのかを推測するのは簡単ではありません。

関連情報