Я новичок в мире Linux, и я использовал Windows и писал на Visual C++ в течение последнего года или около того. Я обнаружил, что bash, похоже, является самой популярной оболочкой в мире Linux. Существует ли оболочка Linux CLI, которая была бы наиболее близка к возможностям bash, но с синтаксисом типов C/C++?
решение1
Есть CSH, который отвечает всем требованиям.
Оболочка C (csh или улучшенная версия tcsh на большинстве машин) — это оболочка Unix, созданная Биллом Джоем, когда он был аспирантом Калифорнийского университета в Беркли в конце 1970-х годов. Она была широко распространена, начиная с выпуска 2BSD системы BSD Unix, которую Джой начал распространять в 1978 году.2Другими ранними участниками идей или кода были Майкл Юбелл, Эрик Оллман, Майк О'Брайен и Джим Калп.
Или вы можете попробовать TCSH (Спасибо! @muru)
tcsh (/ˌtiːˈsiːʃɛl/ "tee-cee-shell", /ˈtiːʃɛl/ "tee-shell", или как аббревиатура "tee cee ess aitch") — оболочка Unix, основанная на оболочке C (csh) и совместимая с ней. По сути, это оболочка C с программируемым завершением командной строки, редактированием командной строки и несколькими другими функциями. В отличие от других распространенных оболочек, функции не могут быть определены в скрипте tcsh, и пользователь должен вместо этого использовать псевдонимы (как в csh).
Обратите внимание, что эти оболочки не так широко используются, как bash, и поэтому некоторые make-файлы и скрипты оболочки могут вести себя непредсказуемо.
решение2
Bash поддерживает некоторый синтаксис в стиле C. Например:
Объявления/определения функций синтаксически похожи на объявления/определения функций в языке C, за исключением того, что вы не определяете ни параметры (которые извлекаются с помощью позиционных параметров
$1
,$2
,$3
, ...), ни возвращаемые типы (Bash вообще не использует типы):foo() { # ... }
Или снова аналогично C, используя встроенное объявление/определение:
foo() { #...; }
Следует отметить, что при использовании встроенного объявления/определения первый и последний операторы должны быть разделены пробелами
{
и}
соответственно, и что (опять же аналогично C) каждый оператор должен быть отделен от других точкой с запятой, а последний оператор должен заканчиваться точкой с запятой:foo() { command1; command2; command3; }
Для полноты картины альтернативным способом объявления/определения функции является использование ключевого слова
function
, которое не требует указания()
после имени функции:function foo { #... }
Вы можете оценить выражение в стиле C, заключив его в двойные скобки
(())
: поддерживается довольно много операторов в стиле C (включая присваивание), например:=
,>
,>=
,==
,!=
,<
,<=
, ,&&
,||
,!
и другие:$ i=0 $ j=1 $ ((i > j)) && echo True $ ((i >= j)) && echo True $ ((i == j)) && echo True $ ((i != j)) && echo True True $ ((i < j)) && echo True True $ ((i <= j)) && echo True True $ ((i && j)) && echo True $ ((i || j)) && echo True True $ ((\! i)) && echo True True $ ((\! j)) && echo True $ ((i = j)) $ echo $i 1 $ echo $j 1
Этот способ оценки выражений в стиле C можно использовать совместно с операторами
if
,while
и :until
if((i == 0)); then # ... done
while((i == 0)); do # ... done
until((i == 0)); do # ... done
В частности,
(())
он также позволяет записыватьfor
условия цикла в стиле C:for((i = 0; i < 3; i++)); do # ... done
Оценка выражений в стиле C не поддерживает присвоение результата оценки; для этого можно использовать арифметическое расширение (
$(())
), которое допускает некое подобие присвоения выражений в стиле C:$ i=0 $ j=1 $ k=$((i > j)) $ echo $k 0 $ k=$((i < j)) $ echo $k 1 $ x=$((1 + 2 + 3)) $ echo $x 6
Также поддерживаются префиксные/постфиксные операторы инкремента/декремента в стиле C:
++i i++ --i i--