ошибка синтаксиса возле неожиданной лексемы `do

Предположим, что это {tab} символов в интервале ...

Вы никогда не увидите табуляцию в ваших awk или tr , потому что он уже использовался в качестве символа разделителя полей cut .

Похоже, вы пытаетесь заменить пустое поле на x . В этом случае вы можете использовать такие конструкции:

#!/bin/bash
#
while IFS= read -r line
do
    first=$(echo "$line" | awk -F$'\t' '{print $1}')
    middle=$(echo "$line" | awk -F$'\t' '{print $2}')
    last=$(echo "$line" | awk -F$'\t' '{print $3}')
    id=$(echo "$line" | awk -F$'\t' '{print $4}')
    dept=$(echo "$line" | awk -F$'\t' '{print $5}')

    echo "First is ${first:-x}"
    echo "Middle is ${middle:-x}"
    echo "Last is ${last:-x}"
    echo "Id is ${id:-x}"
    echo "Dept is ${dept:-x}"
    echo
done

Мы не можем разделить с помощью IFS = $ '\ t' read -r first middle last ... потому что читает ] разбивается на пробелы (пробел, табуляция, новая строка), а не на отдельные экземпляры. (На самом деле это намного сложнее; полные сведения можно найти в разделе «Разделение слов» на странице руководства.)

Я не стал использовать echo "$ line" | cut -f1 и т. д., потому что, если cut исчерпывает поля, он повторно использует последнее найденное.

В качестве альтернативы "$ {middle: -x}" вы можете присвоить переменной x , если она не установлена ​​конструкцией $ {middle: = x} . Префикс с помощью команды no-op : , если вы хотите, чтобы назначение происходило само по себе (а не как побочный эффект какой-либо другой команды):

: ${middle:=x}
echo "The middle is $middle"    # Will be 'x' if it was unset
1
05.09.2017, 17:20
1 ответ

Ваш скрипт DOSзакодирован и sh/ bashэто не нравится. Установите dos2unixи запустите

dos2unix <script>

в вашем скрипте. И снова запустить.

5
27.01.2020, 23:18

Теги

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