Цикл через вкладку формировал рисунок файла в сценарии удара

Ваш сценарий не пытается выполнить Вашу переменную.
Это пытается выполнить вывод от '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
18
21.06.2012, 02:13
2 ответа

Как насчет этого?

$ 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

Я не могу сказать, имеете ли Вы проблему для решения или задаетесь вопросом о более теоретической проблеме.

6
27.01.2020, 19:46
  • 1
    удара GNU Спасибо, который работает. Я пытаюсь записать сценарий для создания 40 + установки Drupal на сервере для класса, который я преподаю. У меня есть сценарии для установки DBS и файлов, это - часть сценария, который соединит все это. Проблема с моим кодом состояла в том, что $line превратил вкладки в пробелы, поскольку он проанализировал. $(echo $line | cut -d" " -f1) также работы. –  mortona42 21.06.2012, 02:34
  • 2
    перестал работать для меня, если какое-либо из полей содержит предложения –  v01pe 19.12.2014, 18:03

Проблема находится в команде 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 опция.

21
27.01.2020, 19:46
  • 1
    +1. Установить IFS на символ вкладки в ударе: IFS=$'\t' –  glenn jackman 21.06.2012, 03:52

Теги

Похожие вопросы