Чтение из файла в массив - PullRequest
0 голосов
/ 28 января 2020

Я пишу сценарий bash, который выполняет различные действия, но при запуске он проверяет, существует ли cra sh, и поэтому пытается загрузить его переменные из файла журнала.

Файл журнала имеет следующий формат:

1stline: var1:var2:var3:var4:var5 # : is a delimeter
2ndline: number                   # [0-9]
3rdline: var6:var7:var8           # : is a delimeter

Итак, как вы можете сказать, у меня есть 9 переменных, которые я буду sh загружать из этого файла, если был файл cra sh.

Я пытаюсь написать код для bash, чтобы сделать это, но я застреваю.

Например, моя идея состоит в том, чтобы создать массив и добавить каждую переменную, которая читается из файла журнала. Но у меня проблемы с написанием этого кода.

if [ -s ${crashfile} ] # file exists => crash has occured
then
    declare -a loadvars
    while IFS= read -r line 

        # What do I do in here ? 

    done < ${crashfile}

else # file doesn't exist => cold start

# bla 
# bla
# bla

fi

Проблема сосредоточена внутри первого, пока l oop. Имеется в виду, что я думаю, что мне нужно создать еще один, в то время как l oop, чтобы соответствующим образом маркировать строку? Но опять же, во второй строке есть только число без разделителя, так что с этим следует обращаться осторожно?

Я могу сделать это с помощью python / C как угодно, но смысл в том, чтобы сделать это с bash .

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Использование временного массива:

vars=()
while IFS=: read -ra temp; do
    vars+=("${temp[@]}")
done < file
printf '<%s>\n' "${vars[@]}"

Для вашего примера (кроме # комментариев) выводится:

<var1>
<var2>
<var3>
<var4>
<var5>
<number>
<var6>
<var7>
<var8>
1 голос
/ 28 января 2020

Если вы действительно уверены в своих 9 переменных:

IFS=$':\n' read -r -d '' var1 var2 var3 var4 var5 number var6 var7 var8

printf '<%s>\n' "$var1" "$var2" "$var3" "$var4" "$var5" "$number" "$var6" "$var7" "$var8"

Если вам нужно прочитать неопределенное количество значений, используйте массив:

IFS=$':\n' read -r -d '' -a vars

printf '<%s>\n' "${vars[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...