Ваш сценарий не пытается выполнить Вашу переменную.
Это пытается выполнить вывод от 'grep'...
Причина, которую это пытается выполнить 3, по той же причине как тогда, когда if command
встречен в сценарии.. Команда выполняется, и ее код выхода тестируется if
.. Ваши grep производят подарки if 3
колотить.
if command ;then do-something; fi
хорошо потому что if
тестирует код выхода command
.
if 3 ; then do-somethin; fi
перестанет работать, потому что 3
не команда... Вот простой пример для указания if command...
function error() { return 1 ; }
if error ;then echo A-cond1 ; else echo A-cond2 ;fi
if echo -n;then echo B-cond1 ; else echo B-cond2 ;fi
# `if 3` fails as you already know..
# output:
A-cond2
B-cond1
Можно легко избежать всего этого и позволить 'sed' обработать тесты условия и вывод.
for var in \
"3 things" \
" 1 leading space" \
"10 green bottles" \
"albatross"
do
echo "$var" |sed -e "s/^\([0-9]\+\).*/\1/" \
-e "s/^[^0-9].*/0/"
done
Вывод:
3
0
10
0
Как насчет этого?
$ awk '{print "DB="$1"\tUSER="$2"\tPASS="$3}' users.txt
DB=drupal_1 USER=drupal1 PASS=tmmjXSWL
DB=drupal_2 USER=drupal2 PASS=FHiJSYHM
DB=drupal_3 USER=drupal3 PASS=b7bFNj06
DB=drupal_4 USER=drupal4 PASS=0AaV62EL
Я не могу сказать, имеете ли Вы проблему для решения или задаетесь вопросом о более теоретической проблеме.
Проблема находится в команде echo $line
. С тех пор вокруг нет никаких кавычек $line
, оболочка выполняет разделение слова на нем, затем интерпретирует каждое слово как globbing шаблон. Испытайте его с
a='*.txt foo'
ls $a
В Вашем случае вкладки разделяют слова, которые затем становятся отдельными аргументами echo
. echo
управляйте печатает его аргументы, разделенные пространством. Так cut
заканчивает тем, что получил разграниченные пространством поля вместо разграниченных вкладкой полей.
Всегда помещайте двойные кавычки вокруг подстановок переменных $foo
и замены команды $(foo)
(если Вы не понимаете, почему необходимо пропустить их и почему нормально делать так). echo "$line"
работал бы здесь, но это - сложный способ сделать то, что Вы предлагаете.
Сохраняя Ваш подход парсинга в оболочке, можно сделать read
управляйте анализируют вход в поля.
while read DB USER PASS; do
echo "DB=$DB USER=$USER PASS=$PASS"
done <users.txt
read
поля разделений, разделенные символами в значении IFS
переменная, которая состоит из пространства и вкладки (плюс новая строка, которая не может произойти в строке), по умолчанию. Для разделения только во вкладках установить IFS
к единственной вкладке сначала. Обратите внимание, что, ведя и запаздывая вкладки проигнорированы и последовательное количество вкладок как единственное.
read
обработки \
как специальный символ: проигнорирована обратная косая черта, сопровождаемая новой строкой; \\
становится единственной обратной косой чертой. Если Вы хотите избежать этого поведения, передайте -r
опция.
$(echo $line | cut -d" " -f1)
также работы. – mortona42 21.06.2012, 02:34