Ваш скрипт работает, ваш тест не работает.Не используйте трубы там.
# ./test.sh 1 ; echo $?
0
# ./test.sh 2 ; echo $?
1
То, что вы предложили с конвейером, не может работать, потому что все процессы в конвейере запускаются "одновременно".Оболочка запускает под-оболочку для размещения каждого процесса (по крайней мере, это делает Bash, реализации могут отличаться - в этом нет уверенности), соответствующим образом соединяет входной и выходной потоки, а затем позволяет ОС планировать события по своему усмотрению.
Таким образом, самый правый процесс (в вашем случае echo $?
) запускается в то же время, что и ваш тестовый скрипт.Следовательно, $?
в этой вложенной оболочке (которая будет развернута до запуска фактического процесса) не может представлять код возврата из тестового сценария - t.sh
, возможно, даже еще не запустился!
См. Статью в Википедии Трубопроводы Unix для получения дополнительной информации или документации по оболочкам.( Bash Pipelines , например.)