シェルスクリプト
現代の多くのシェルは手続き型プログラミング言語にある基本的な制御フロー構造などに似た豊富な機能を備えている。制御構造、変数、コメント、配列、サブルーチンなどである。それらを使えばかなり洗練されたアプリケーションをシェルスクリプトで書くことも可能である。しかし、シェル言語の多くはデータ型システム、クラス、スレッド、複雑な数学的計算といった高水準言語に見られる機能をほとんどサポートしていない。また、コンパイラや性能重視のインタプリタで実装された汎用言語に比べれば実行速度が遅い。
また、UNIXには1文字しか違わないコマンド名が多く存在するため、さらにうっかりミスの危険性が増す。例えば、cp、cd、dd、df(英語版) などである。この中でもcpとの取り違えでは、誤ったパスにファイルをばら撒き、コピー先のファイル構成を破壊して復旧作業に多大な時間が必要となったり、セキュリティ事故に発展する可能性がある。
もう1つの短所は、実行速度の遅さとほぼ全てのコマンド実行の呼び出しで新たなプロセスを生成する必要がある点である。実際にデータを処理するコマンドはC言語などの高速な言語で実装されているため処理速度自体はあまり問題にならない。しかし、シェルスクリプトから多数のコマンドを呼び出す場合、その呼び出しコストによって桁違いの遅さになることが多い。処理するデータが多い場合は一括してコマンドに渡して処理し、処理するデータが少ない場合はシェル自身が持っている機能(変数展開など)を使って処理することで、実行速度の遅さをある程度回避できる。しかしそのような工夫をするぐらいなら他のスクリプト言語やコンパイラ言語を使った方が簡単である。
また、プラットフォーム間の互換性問題もある。シェルスクリプトからよく利用されるUNIXコマンドは歴史的な理由でプラットフォーム間で完全な互換性がないため、そのようなコマンドに依存するシェルスクリプトは移植性が低くなりがちである。
同じプログラムを書く場合、他のプログラミング言語よりもシェルスクリプトの方が短く書けることが多い。OS標準コマンド以外を含む豊富なコマンドを容易に利用できるからである。既存のプログラム群を順次実行したり、コマンドの実行結果やファイルの有無などの条件判断を伴って実行する場合などはシェルスクリプトが有効で、限定的ながらパイプライン処理、バックグラウンドジョブ、xargsコマンドの-Pオプションなどを利用すれば、並列処理、並行計算を容易に行うことができる。また、スクリプト言語全般に当てはまることではあるがコンパイルが不要という点も利点の一つである。
一方でシェルスクリプトは中規模以上のプログラムには向いていない。言語仕様やデバッグ機能や例外処理が貧弱で致命的なエラーを引き起こしやすい。例えばrm -rf */をrm -rf * /と打ち間違える有名なミスが存在する。空白が余分に1つ入っただけで、あるディレクトリ以下を削除するつもりだったものがルートディレクトリ以下を削除するという意味になる。またcp や mv、出力をリダイレクトする>を間違って使用すると意図せずファイルを上書きしてしまうことがある。