Это нелегко, поскольку вы не можете назначать переменные одинаково или выполнять операторы одинаково.
Вы можете использовать скудные навыки разбора строк в csh. Следующее выполняется чисто во всех оболочках, включая KSH, BASH, ZSH, CSH и SH на всех платформах, на которых я его тестировал (Linux, AIX, HP-UX, Solaris):
test '\\' = "\\" && echo "CSH detected"
Идея, которая здесь используется, заключается в том, что обратные слеши не являются специальными в строках с двойными кавычками в CSH, тогда как все другие оболочки видят их как разные.
Однако это только половина ответа, что вы хотите сделать, если не хотите просто выйти из сценария, если обнаружена «неправильная» оболочка? Ну, вы, возможно, захотите иметь в своем сценарии партию Bournish sh
и партию csh
.
Если вы можете ограничить код csh
кодом, который не использует одинарные кавычки, везде будет работать следующее:
test '\\' = "\\" && goto csh
# Just skip the block containing the csh code. Again we use csh's meagre string parsing capabilities against it.
false || csh_code_block='
csh:
... csh code goes here ...
exit 0
'
... sh code goes here ...
Если вы не беспокоитесь о csh
в HP-UX (что кажется немного лучше, чем другие при разборе), вы можете заменить многострочную команду в одинарных кавычках документом «ЗДЕСЬ» (<<CSH_BLOCK ... CSH_BLOCK
). Вы также не можете просто изменить порядок, так как оператору 'goto' не нравится весь синтаксис, который он пропускает.