cshで次のbash関数を使用できるようにcshエイリアスを作成しています。
function up( )
{
LIMIT=$1
P=$PWD
for ((i=1; i <= LIMIT; i++))
do
P=$P/..
done
cd $P
export MPWD=$P
}
(私は上記のbash機能を盗んだ。ここ)
私はこれを書いた:
alias up 'set LIMIT=$1; set P=$PWD; set counter = LIMIT; while[counter!=0] set counter = counter-1; P=$P/.. ; end cd $P; setenv MPWD=$P'
ただし、次のエラーが発生します。
while[counter!=0]: No match.
P=/net/devstorage/home/rghosh/..: Command not found.
end: Too many arguments.
私のスクリプトは期待どおりに動作しません。私はcshを読んでいますここ。
答え1
while
1行でループを実行できるかどうかはわかりません。しかし、いくつかの修正可能なバグがあります。
while[counter!=0]
そうする必要がありますwhile ($counter != 1)
( " "前後のスペースに注意してください!=
)。set counter = counter-1
そうする必要があります@ counter = $counter – 1
( " "前後のスペースに注意してください–
)。P=$P/..
set P=$P/..
–– 以上でなければなりませんset P="$P/.."
($P
スペースが含まれている場合)。- それは同じ理由で
set P=$PWD
なければならずset P="$PWD"
、すべきcd $P
でなければならcd "$P"
ないsetenv MPWD=$P
ことを思い出させます。setenv MPWD="$P"
while
そして、ループが1行ですべて機能するようにするには、;
おそらくend
。
答え2
複数行のコードの場合、エイリアスは一重引用符で囲み、各行の末尾にバックスラッシュを付ける必要があります。最後の行の終わりは、エイリアスの終わりを区切る一重引用符の前になければなりません。
alias up 'set counter = \!$\
set p = "$cwd"\
while ( $counter >= 1 )\
@ counter = $counter - 1\
set p = "$p/.."\
end\
cd "$p"\
setenv mpwd "$p"'
コマンドエディタ/記録に問題がある場合は、別名のkill -INT $$
末尾に追加してください。
ところで、変数を設定するときは、set
等号を使用して変数名と内容を区別するのが最善です。等号はsetenv
必要ありません。@
制御構造は括弧を使用して提供されます。$cwd現在の作業ディレクトリを印刷します。より良い数値テストには、より大きい(>; >=)およびより小さい(<; <=)演算子を使用してください\!$
。