コマンドをファイルに保存

コマンドをファイルに保存

以下のコードを使用してファイルを簡単に呼び出せるように、コマンドをファイルに保存しようとしています。

./test

このコードを実行する必要があります。

Set n=0 ; foreach sql ( *_*.sql)
foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End
echo You changed $n files

私は次のように入力しました。

set n = 0 > test
foreach sql ( *_*.sql) >> test

ここまで来たとき、ターミナルに空白行が現れ、次の3行をブラインド入力しました。

foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End

それから次に終わります。

echo 'echo You changed $n files' >> test

完了すると、出力ファイルには次のコンテンツのみが含まれます。

foreach? sed "s/_/-/g" $sql
foreach? @ n ++
foreach? end
echo You changed $n file

set コマンドと foreach ループの開始が完全に欠落しています。私がここで何を見逃しているのでしょうか?それとも単に不可能ですか?

編集済み

#!/bin/tcsh
set n=0
foreach sql ( *_*.sql )
sed "s/_/-/g" $sql
@ n ++
end
echo You changed $n files
chmod 777 test

答え1

シェルのコマンドラインで操作を実行しようとすると問題がたくさんあります。echo方向を変えなければならないすべて現在シェルで解釈され、生成されているファイルに配置されないように、シェルメタ文字を引用する必要があります。testファイルを編集してファイルに直接シェルコマンドを入力するには、テキストエディタを使用するのが最善です。

答え2

スクリプトにはまだいくつかの問題があります。

まず、テキストエディタは次のようになります。これ99%の場合、スクリプトを書く正しい方法です。 echoコマンドを使用して手動で1行ずつビルドするのは面倒で利点はありません。 (残りの1%には、おなじみのエディタがないシステムにいる場合、またはプログラムを使用して自動的にスクリプトを生成する必要がある合理的な理由がある場合が含まれており、どちらもアプリケーションには適用されません)。 )

最初の行はでなければなりませ#!/bin/tcsh -fんが、そうではありません#!/bin/tcsh-f起動ファイル(.tcshrc、、、.cshrc)をインポートしないように指示する.loginと、スクリプトはそれ自体に含まれます。それが不足し-fても問題は発生しないかもしれませんが、持っていることをお勧めします。 (注:これはshスクリプトには適用されませんbash。そのシェルの場合は-fまったく異なることを意味します。)

この行は:

sed "s/_/-/g" $sql

各ファイルを読み、すべての下線をハイフンに変更します。ただし、出力はstdoutに書き込まれます。いいえ入力ファイルに戻ります。ファイル自体は変更されませんでした。なぜなら、あなたはこれをしたからです:

echo You changed $n files

私の考えでは、これはあなたの計画に合わないと思います。

ファイルを適切に変更するのは実際には非常に面倒です。私は次のようにします:

sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql

これにより、ファイルが変更され、変更され$sqlたバージョンが一時ファイルに書き込まれます。 もし成功すると、一時ファイル名が$sql

同様のタスクを実行する-iオプションもあります。sed

sed -i.bak "s/_/-/g" $sql

インデントはあなたの友人です。コード構造を表示するには、行と行の間のforeachすべての内容をインデントする必要があります。end(私は4つのスペースを使用します。一部の人は異なる数のスペースを好むか、タブを使用します。)

最後に、スクリプト自体chmod 777 testには表示しないでください。スクリプトを実行可能にtestするには、コマンドラインからコマンドを実行する必要があります。スクリプトを読みやすく実行可能にするのは悪い考えですtest777書き込み可能システムの誰もが。代わりに使用してくださいchmod +x test

./testを入力するのではなく、入力してスクリプトを実行する必要がありますtest。 (あなたの質問によると、すでにこれを行っています。)それ以外の場合は、testスクリプトの代わりに組み込みコマンドを実行している可能性があります。 (a)構文を使用して一貫して呼び出すtest(b)。./test.$PATH

多くのスクリプトを書く場合、shまたはbash代わりに、cshまたは使用を検討する必要がありますtcshこの記事理由を説明しました。

最後に(そしてこれがおそらくここで最も重要な教訓でしょう)実際に何をしたいのか言っていませんでした。私考える下線をハイフンに置き換えて、一部のファイルの内容を変更しようとしています。それとも名前は変更し、内容は変更しませんか?私たちに示したのはコードの塊だけなので、何をしたいのかを判断することは不可能です。それはうまくいきません。うまくいかないコードを私たちに示すのは問題ではありませんが、あなたが達成したいことを英語で私たちに伝えない限り、それを修正する方法についてアドバイスすることはできません。

答え3

推奨されるようにエディタを使用してシェルスクリプトを作成します。

修正内容は次のとおりです。編集されたバージョン:

「コマンドが見つかりません」というエラーメッセージを削除するset n=0代わりに、以下を作成する必要があります。n=0

foreach sql ( *_*.sql )変えるforeach sql *_*.sql

代わりに。endEnd

sedのパラメータを引用するので"はなく、一般的な引用が必要です。

関連情報