>>
ファイルにコマンドを追加する完全なシェルスクリプトを作成したいと思います。たとえば、エディタを使用して作成されたように、次のスクリプトを考えます。
echo Hello World, done
echo please enter the first number
read num1
echo please enter the second number
read num2
echo $num1 plus $num2 is `expr $num1 + $num2`
端末ウィンドウでecho echo Hello World, "done" >> file.sh
ファイルにすべての行を書き込もうとしました。ファイルを実行するときにターミナルが "done" キーワードを考慮しないように "done" の周りに引用符を付けました。ただし、ファイルが正しく実行されたことを確認すると、キーワード「done」に引用符はありません。そして、上記のコードの最後の行をターミナルウィンドウに入力してファイルに追加すると、すべてのファイルが表示されます。なぜ変数と式がファイルに追加されないのかecho plus is
疑問に思います。expr
デフォルトでは、ターミナルウィンドウで上記のコードを再作成したいと思います。 Ubuntu 12.04を実行しており、bashバージョンは4.2.24です。
答え1
素晴らしいです。シェルはファイルに追加する前に文字を解釈します。
echo echo Hello World, "done" >> file.sh
シェルの解釈"
、標準から削除echo
。したがって、これを脱出する必要があります。
echo echo Hello World, \"done\" >> file.sh
またはより簡単には、内容全体をに含めます'
。
echo 'echo Hello World, "done"' >> file.sh`
そう言いましたが、何を言うのかよく分かりません。
ファイルを実行するときに端末が「完了」キーワードを考慮していないことを確認してください。
done
a 後ろの A はecho
意味がありません。新しいスクリプトは単一のテキストのみを印刷しますdone
。テストしてみてください!
同様に、
echo $num1 plus $num2 is `expr $num1 + $num2`
シェルは変数を解釈し、expr
今後ファイルに添付されます。繰り返しますが、'
。
echo 'echo $num1 plus $num2 is `expr $num1 + $num2`' >> file.sh
そう言ったのですが、なぜそんなことをしたいのかわかりません。ただテキストエディタを使用してください。'
スクリプトでテキストを使用したい場合は、これが問題になる可能性があります。
答え2
次の構造を試してください。
$ cat > file.sh << "EOF"
echo Hello World, done
read num1
echo please enter the second number
read num2
echo Sum of $num1 and $num2 is `expr $num1 + $num2`
EOF
最初からLinuxスクリプトからファイルの作成まで、すべてがこの方法を使用します。done
上書きされた場合は、EOF
Sparhawkが推奨するようにエスケープすることを検討してください。
答え3
リダイレクトを使用して端末のインタラクティブシェル(シェルスクリプト)からテキストファイルを作成する最も簡単な方法は、次のことです。
$ cat >filename
...その後、目的のテキストを貼り付けるか入力を開始します(>>
代わりに>
追加すでに存在するファイルとして)。完了したら を押しますCtrl+D。
追加ボーナスとして、シェルはこの方法でテキストファイルに貼り付けたり、入力した内容を他に解釈しません。 1行挿入または複数行挿入文書を使用する場合は、echo
シェルが文書コンテンツ内の変数、エスケープシーケンスなどを拡張しないように、正しい引用符を使用してテキストを保護する必要があります。
スクリプト内でスクリプトを生成するには、ここで参照されているドキュメントを使用してください。
cat <<'END_SCRIPT' >filename
script
goes
here
END_SCRIPT
あなたの質問の問題は、単にecho
行の前に追加するときに追加の予防措置を講じない限り、残りの行はまだシェルによって解釈されることです。