シェルについて何も知らずに、どのシェル固有のコードが属しているのか、どうすればわかりますか?

シェルについて何も知らずに、どのシェル固有のコードが属しているのか、どうすればわかりますか?

bashこのコードはシェル用であることを知っています。

for f in $file.docked.[0-9][0-9][0-9]
do
  mv $f $f.pdb
done

このコードはtcshシェル用です。

foreach f ( file.docked.[0-9][0-9][0-9] )
  mv $f $f.pdb
end

参考資料を読んでみるとこう理解できました。学習者として両方のコードをbash。作成されたLinuxシェルの種類に関係なく、拡張機能を使用してすべてのシェルでコードを実行できるようにする方法はありますか?

答え1

for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done

csh銀とBourneスイートのすべてのシェル(ash、bash、zsh、ksh、zsh、mksh、yash ...)tcshで構文的に有効なコードですが、役に立つzsh作業を実行する可能性が最も高いです。

このコードの目的が、現在のディレクトリのファイル名にシェル変数の内容で始まり、3つのASCII 10進数で終わるサフィックスを追加することであれば、.pdb次のものが必要です。$file.docked.bash

shopt -s failglob
for f in "$file".docked.[0123456789][0123456789][0123456789]
do
mv -- "$f" "$f.pdb"
done

--シェルに関係なく必要)bash

  • Kornシェルと同様に、パラメータ拡張を引用する必要があります。それ以外の場合は分割+globを経ます。
  • [0-9]通常、0123456789よりも多くの文字と一致し、そのリストはロケールとシステムによって異なります。 0123456789を[0123456789]一致させるだけですbash(いいえ、最新バージョンのオプションはglobasciiranges役に立ちません)。
  • 一致しないと glob は拡張されないため、一致するファイルがない場合はループにインクルードを介して$f渡されます。 (cshまたはzshに似た動作を得るために)または(コピーされたオプションで)問題を解決します。contents-of-file-variable.docked.[0-9][0-9][0-9]failglobnullglobzsh
foreach f ( file.docked.[0-9][0-9][0-9] )
  mv $f $f.pdb
end

構文のように見えますが、再構文cshですzsh。しなければなら(t)cshない:

foreach f ( file.docked.[0-9][0-9][0-9] )
  mv -- $f:q $f:q.pdb
end

(この特別なケースでは、:q他の例とは異なり、sは必ずしも必要ではありませんが、ファイル名にSPC、TAB、LF、またはワイルドカード文字が含まれないことが保証されます。)

まったく異なる言語で同じことを行う有効なコードを書くのは非常に面倒です。一般的に多言語コーディング。これCode Golf stackex 姉妹サイトには専用のセクションがあります。。しかし、これは一般的にやりたいことではありません。

バラよりこのウェブサイトの例これを達成するのに必要な長さの例である。

関連情報