Если для того, чтобы изучать shell программирование, то точно надо понять какие shell есть. Есть bash, zsh, ksh, dash, ash из busybox, ash из BSD-шних систем, sh из Соляриса (С-shells - csh и tcsh во внимание не берем, как и wish, rc и другие экзотические шелл). Все эти оболочки являются клонами первой юниксовской шелл, которая называлась просто sh и была написана Стивеном Борном, поэтому их называют производными bourne shell.
Под shell программированием понимают или переносимое, или программирование POSIX shell. Первое подразумевает под собой написание кода, которое будет выполняться в любой bourne shell. Это довольно сложное дело, к примеру нельзя пользоваться [ (а уж тем более [[ ) в if, только test. Есть очень хорошая книга, можно найти в Инете, - Beginning portable shell programming. Несмотря на название, книга точно не для новичков.
Posix shell - эта оболочка, которая описана в стандарте POSIX. Современные реализации ash (в свое время просто переписанной bourne shell с открытым кодом), как правило, включают в себя возможности, описанные в POSIX. dash - это специально для Дебиана переписанная ash с целью наиболее точного соответствия POSIX. По сравнению с bash, zsh, ksh - она очень ограниченна - можно, к примеру, использовать ((1+1)) и $(some_command), но не [[ test ]] или массивы, и еще огромного количества возможностей, в том числе и строковых функций на переменных, включая ${var:0:4}.
Так заканчиваю. В переносимой или POSIX шелл, поставленную задачу, выполнить, как минимум очень сложно. Навскидку - при переносимом программировании - нельзя, а в POSIX - уродливо. Но шелл программирование - это прежде всего использование командных утилит. С самого начала шелл разрабатывалась для клея - склеивания разных комманд между собой. Нельзя "научиться shell", не зная и не умея применять как простые утилитки, так и "столпы" - find, grep, sed (awk по вкусу, я perl предпочитаю).