web-dev-qa-db-ja.com

シェルについての知識なしに、特定のコードがどのシェルに属しているかを理解するにはどうすればよいですか?

このコードが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
Praveen Kumar-M
for f in $file.docked.[0-9][0-9][0-9]
do
mv $f $f.pdb
done

cshtcshおよび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のように、シェルに関係なく--が必要です)

  • kornシェルのように、パラメーター展開を引用符で囲む必要があります。
  • [0-9]は通常、0123456789だけではなく、より多くの文字に一致します。そのリストは、ロケールとシステムによって異なります。 bash[0123456789]または[[:digit:]]は、0123456789のみに一致する必要があります(または、最近のバージョンではglobasciirangesを設定します)。
  • 一致しない場合、グロブは展開されないままなので、一致するファイルがなかった場合、$fを含むcontents-of-file-variable.docked.[0-9][0-9][0-9]を使用してループで1つのパスを取得します。 failglob(cshまたはzshと同様の動作を行うため)またはnullglobzshからコピーされたオプション)がそのアドレスを指定します。
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

(その特定のケースでは、他のサンプルとは異なり、:qsは厳密には必要ありませんが、ファイル名にはSPC、TAB、LFまたはワイルドカード文字が含まれていないことが保証されています) 。

完全に異なる言語で有効で同じことを行うコードを書くのは非常に難しいです。これは一般的にpolyglot codingと呼ばれます。 Code Golf stackexchange姉妹サイトには、そのためのセクションがあります 。しかし、それはあなたが普通にやりたいことではありません。

それを達成するために移動する必要がある種類の長さの例として このサイトのこの例 を参照してください。

5