このエラーは引き続き発生します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'
done
Bashが予約語の前に一致するものがない場合に発生するエラーです。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が何を読んでいるのかを推測するのは簡単ではありません。