このコードが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のシェルのタイプに関係なく、すべてのシェルでコードを機能させる方法はありますか?
for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done
csh
、tcsh
およびBourneファミリーのすべてのシェル(ash、bash、zsh、ksh、zsh、mksh、yash ...)の構文的に有効なコードですが、zsh
何か有用なことをしている可能性が最も高い。
そのコードの目的が.pdb
サフィックスを現在のディレクトリ内のファイル名に追加することである場合、$file
シェル変数の内容で始まり、.docked.
で終わり、その後に3が続きます。 ASCII 10進数、bash
には、次のものが必要です。
shopt -s failglob
for f in "$file".docked.[0123456789][0123456789][0123456789]
do
mv -- "$f" "$f.pdb"
done
(bash
のように、シェルに関係なく--
が必要です)
[0-9]
は通常、0123456789だけではなく、より多くの文字に一致します。そのリストは、ロケールとシステムによって異なります。 bash
の[0123456789]
または[[:digit:]]
は、0123456789のみに一致する必要があります(または、最近のバージョンではglobasciiranges
を設定します)。$f
を含むcontents-of-file-variable.docked.[0-9][0-9][0-9]
を使用してループで1つのパスを取得します。 failglob
(cshまたはzshと同様の動作を行うため)またはnullglob
(zsh
からコピーされたオプション)がそのアドレスを指定します。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またはワイルドカード文字が含まれていないことが保証されています) 。
完全に異なる言語で有効で同じことを行うコードを書くのは非常に難しいです。これは一般的にpolyglot codingと呼ばれます。 Code Golf stackexchange姉妹サイトには、そのためのセクションがあります 。しかし、それはあなたが普通にやりたいことではありません。
それを達成するために移動する必要がある種類の長さの例として このサイトのこの例 を参照してください。