Добрый день.
В процессе написания скрипта столкнулся с таким моментом:
Есть файл с текстом:
1212 |  4956666666  |    0000
парсим этот файл простым скриптом, что бы получить только значение до первого "|":
#!/bin/bash
cat text | grep $1 | awk -F "|" {'print $1'}
leks@leks-PC:~/sripts$ bash -x ./test 6666
+ cat text
+ grep 6666
+ awk -F '|' '{print $1}'
1212
и даже получаем нужное значение.
Но как bash понял что в строке  
cat text | grep $1 | awk -F "|" {'print $1'}   :
grep $1 (тут берем первый входной параметр), 
а тут  
awk -F "|" {'print $1'}  берем первый результат разделения строки с помощью awk?
Почему не интерпретировал строку как 
cat text | grep 6666 | awk -F "|" {'print 6666'}? 
Если без конкретного примера, то вопрос могу сформулировать так:
Как избегаются конфликты переменных при выполнение скрипта ./test $1 $2 $3 $4  и  программ (awk, sed  и пр) которые внутри скрипта  в своем внутреннем синтаксисе используют такие же переменные?
Уффф надеюсь подробно и понятно написал)