
以下のコードを使用してファイルを簡単に呼び出せるように、コマンドをファイルに保存しようとしています。
./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
するには、コマンドラインからコマンドを実行する必要があります。スクリプトを読みやすく実行可能にするのは悪い考えですtest
。777
書き込み可能システムの誰もが。代わりに使用してください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
代わりに。end
End
sedのパラメータを引用するので"
はなく、一般的な引用が必要です。“