Чтение файла в массив

Как я могу прочитать файл в сценарии оболочки, а затем назначить каждую строку переменной, которую я могу использовать позже ?, (я думаю, чтобы загрузить настройку по умолчанию из файла)

я уже пытаюсь :

process (){ } FILE='' read -p "Please enter name of default file : " FILE if [ ! -f $FILE ]; then echo "$FILE : does not exists " exit 1 elif [ ! -r $FILE ]; then echo "$FILE : can not read " fi exec 0<"$FILE" n=0 while read -r line do (assign each line to an variable) done
4
задан 7 June 2011 в 22:02

20 ответов

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а затем использовать его с помощью . /path/to/config.

Пример default.cfg:

parameter_a=100
parameter_b=200
parameter_c="Hello world"
[d3 ] Пример default.cfg :

#!/bin/bash

# source the default configuration
. /path/to/default.cfg

echo $parameter_a
echo $parameter_b
echo "$parameter_c"

...

Если вам не нравится этот подход, вы также можете прочитать строки в массиве:

while read line
do
    array+=("$line")
done < some_file

Для доступа к элементам, которые вы затем использовали бы ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++))
do
    echo "${array[i]}"
done

(Где ${#array[*]} - размер массива.)

Узнайте больше о массивах в bash здесь.

10
ответ дан 25 May 2018 в 22:37
  • 1
    Я бы использовал array+=("$line"), а не array[${#array[*]}]="$line", или если нужно поддерживать bash старше v3.1, array[i++]=$line (где вы обязательно установите i=0 до цикла, конечно). – geirha 10 March 2011 в 20:13
  • 2
    Я тоже рекомендую исходный подход кстати. Хотя я бы использовал имена переменных нижнего регистра, а не все прописные буквы ..., чтобы избежать перезаписи переменных среды или внутренних переменных оболочки. – geirha 10 March 2011 в 20:22
  • 3
    @geirha: Спасибо (еще раз) за ваши комментарии! Не знал о синтаксисе + = (), который, безусловно, легче читать (и писать). – htorque 10 March 2011 в 21:23
  • 4
    Вы должны использовать IFS= read -r, чтобы избежать удаления удаляемых вкладок / пробелов. Сравните printf "\thello\n world\n" | while read -r line; do echo "$line"; done и printf "\thello\n world\n" | while IFS read -r line; do echo "$line"; done – Sergiy Kolodyazhnyy 1 November 2017 в 03:58

для использования в конфигурации это, наверное, простой для определения параметров В файле конфигурации в синтаксисе bash и позже источник его помощью . /path/to/config.

пример по умолчанию.cfg следующее:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

пример по умолчанию.cfg в:

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

если вам не нравится этот подход, Вы также можете читать строки в массив:

while read line do array+=("$line") done < some_file

для доступа к элементам с помощью ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(где ${#array[*]} - Размер массива).

подробнее о массивах в bash здесь.

10
ответ дан 25 July 2018 в 22:22

для использования в конфигурации это, наверное, простой для определения параметров В файле конфигурации в синтаксисе bash и позже источник его помощью . /path/to/config.

пример по умолчанию.cfg следующее:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

пример по умолчанию.cfg в:

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

если вам не нравится этот подход, Вы также можете читать строки в массив:

while read line do array+=("$line") done < some_file

для доступа к элементам с помощью ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(где ${#array[*]} - Размер массива).

подробнее о массивах в bash здесь.

10
ответ дан 26 July 2018 в 21:01

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а затем использовать его с помощью . /path/to/config.

Пример default.cfg:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

Пример default.cfg :

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

Если вам не нравится этот подход, вы также можете прочитать строки в массиве:

while read line do array+=("$line") done < some_file

Для доступа к элементам, которые вы затем использовали бы ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(Где ${#array[*]} - размер массива.)

Узнайте больше о массивах в bash здесь.

10
ответ дан 31 July 2018 в 12:44

для использования в конфигурации это, наверное, простой для определения параметров В файле конфигурации в синтаксисе bash и позже источник его помощью . /path/to/config.

пример по умолчанию.cfg следующее:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

пример по умолчанию.cfg в:

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

если вам не нравится этот подход, Вы также можете читать строки в массив:

while read line do array+=("$line") done < some_file

для доступа к элементам с помощью ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(где ${#array[*]} - Размер массива).

подробнее о массивах в bash здесь.

10
ответ дан 2 August 2018 в 03:49

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а затем использовать его с помощью . /path/to/config.

Пример default.cfg:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

Пример default.cfg :

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

Если вам не нравится этот подход, вы также можете прочитать строки в массиве:

while read line do array+=("$line") done < some_file

Для доступа к элементам, которые вы затем использовали бы ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(Где ${#array[*]} - размер массива.)

Узнайте больше о массивах в bash здесь.

10
ответ дан 4 August 2018 в 19:53

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а затем использовать его с помощью . /path/to/config.

Пример default.cfg:

parameter_a=100 parameter_b=200 parameter_c="Hello world"

Пример default.cfg :

#!/bin/bash # source the default configuration . /path/to/default.cfg echo $parameter_a echo $parameter_b echo "$parameter_c" ...

Если вам не нравится этот подход, вы также можете прочитать строки в массиве:

while read line do array+=("$line") done < some_file

Для доступа к элементам, которые вы затем использовали бы ${array[index]}, например:

for ((i=0; i < ${#array[*]}; i++)) do echo "${array[i]}" done

(Где ${#array[*]} - размер массива.)

Узнайте больше о массивах в bash здесь.

10
ответ дан 6 August 2018 в 03:56

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а позже использовать его с помощью . /path/to/config.

Пример default.cfg :

  parameter_a = 100 parameter_b = 200 parameter_c = "Hello  world " 

Пример script.sh :

  #! / bin / bash # указать конфигурацию по умолчанию.  /path/to/default.cfg echo $ parameter_a echo $ parameter_b echo "$ parameter_c" ...  

Если вам не нравится этот подход, вы также можете прочитать строки в массив:

  при чтении строки do array + = ("$ line") done & lt;  some_file  

Чтобы получить доступ к элементам, которые вы затем использовали бы $ {array [index]} , например:

  для ((  i = 0; i & lt; $ {# array [*]}; i ++)) do echo "$ {array [i]}" done  

(Где $ {# array [*]} - размер массива.)

Подробнее о массивах в bash здесь .

10
ответ дан 7 August 2018 в 21:53

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а позже использовать его с помощью . /path/to/config.

Пример default.cfg :

  parameter_a = 100 parameter_b = 200 parameter_c = "Hello  world " 

Пример script.sh :

  #! / bin / bash # указать конфигурацию по умолчанию.  /path/to/default.cfg echo $ parameter_a echo $ parameter_b echo "$ parameter_c" ...  

Если вам не нравится этот подход, вы также можете прочитать строки в массив:

  при чтении строки do array + = ("$ line") done & lt;  some_file  

Чтобы получить доступ к элементам, которые вы затем использовали бы $ {array [index]} , например:

  для ((  i = 0; i & lt; $ {# array [*]}; i ++)) do echo "$ {array [i]}" done  

(Где $ {# array [*]} - размер массива.)

Подробнее о массивах в bash здесь .

10
ответ дан 10 August 2018 в 10:08

Для целей конфигурации, вероятно, проще всего определить параметры в файле конфигурации в синтаксисе bash, а позже использовать его с помощью . /path/to/config.

Пример default.cfg :

  parameter_a = 100 parameter_b = 200 parameter_c = "Hello  world " 

Пример script.sh :

  #! / bin / bash # указать конфигурацию по умолчанию.  /path/to/default.cfg echo $ parameter_a echo $ parameter_b echo "$ parameter_c" ...  

Если вам не нравится этот подход, вы также можете прочитать строки в массив:

  при чтении строки do array + = ("$ line") done & lt;  some_file  

Чтобы получить доступ к элементам, которые вы затем использовали бы $ {array [index]} , например:

  для ((  i = 0; i & lt; $ {# array [*]}; i ++)) do echo "$ {array [i]}" done  

(Где $ {# array [*]} - размер массива.)

Подробнее о массивах в bash здесь .

10
ответ дан 13 August 2018 в 16:29
  • 1
    Я использовал бы массив + = («$ line») , а не array [$ {# array [*]}] = "$ line" , или если один должен поддерживать bash старше v3.1, array [i ++] = $ line (где вы обязательно установите i = 0 до цикла, конечно). – geirha 10 March 2011 в 20:13
  • 2
    Я тоже рекомендую исходный подход кстати. Хотя я бы использовал имена переменных нижнего регистра, а не все прописные буквы ..., чтобы избежать перезаписи переменных среды или внутренних переменных оболочки. – geirha 10 March 2011 в 20:22
  • 3
    @geirha: Спасибо (еще раз) за ваши комментарии! Не знал о синтаксисе + = (), который, безусловно, легче читать (и писать). – htorque 10 March 2011 в 21:23
  • 4
    Вам нужно использовать IFS = read -r , чтобы избежать удаления удаляемых вкладок / пробелов. Сравните printf & quot; \ thello \n world \n & quot; | при чтении строки -r; do echo & quot; $ line & quot ;; done и printf \ \ thello \n world \n & quot; | при чтении IFS строки -r; do echo & quot; $ line & quot ;; сделано – Sergiy Kolodyazhnyy 1 November 2017 в 03:58
[F1]
0
ответ дан 25 May 2018 в 22:37
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
c=0 # counter # read whole file in loop while read line do textArray[$c]=$line # store line c=$(expr $c + 1) # increase counter by 1 done < $FILE # get length of array len=$(expr $c - 1 ) # use for loop to reverse the array for (( i=$len; i>=0; i-- )); do echo ${textArray[$i]} done
0
ответ дан 25 July 2018 в 22:22
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
c=0 # counter # read whole file in loop while read line do textArray[$c]=$line # store line c=$(expr $c + 1) # increase counter by 1 done < $FILE # get length of array len=$(expr $c - 1 ) # use for loop to reverse the array for (( i=$len; i>=0; i-- )); do echo ${textArray[$i]} done
0
ответ дан 26 July 2018 в 21:01
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
[F1]
0
ответ дан 31 July 2018 в 12:44
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
[F1]
0
ответ дан 2 August 2018 в 03:49
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
[F1]
0
ответ дан 4 August 2018 в 19:53
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
[F1]
0
ответ дан 6 August 2018 в 03:56
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$foo", а не $foo. См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52
  c = 0 # counter # чтение целого файла в цикле, в то время как read line do textArray [$ c] = $ line # строка хранения c = $ (expr $ c + 1) # увеличение счетчика на 1 done & lt;  $ FILE # get length of array len = $ (expr $ c - 1) # использовать для цикла для обращения к массиву для ((i = $ len; i & gt; = 0; i--));  do echo $ {textArray [$ i]} done  
0
ответ дан 7 August 2018 в 21:53
  c = 0 # counter # чтение целого файла в цикле, в то время как read line do textArray [$ c] = $ line # строка хранения c = $ (expr $ c + 1) # увеличение счетчика на 1 done & lt;  $ FILE # get length of array len = $ (expr $ c - 1) # использовать для цикла для обращения к массиву для ((i = $ len; i & gt; = 0; i--));  do echo $ {textArray [$ i]} done  
0
ответ дан 10 August 2018 в 10:08
  c = 0 # counter # чтение целого файла в цикле, в то время как read line do textArray [$ c] = $ line # строка хранения c = $ (expr $ c + 1) # увеличение счетчика на 1 done & lt;  $ FILE # get length of array len = $ (expr $ c - 1) # использовать для цикла для обращения к массиву для ((i = $ len; i & gt; = 0; i--));  do echo $ {textArray [$ i]} done  
0
ответ дан 13 August 2018 в 16:29
  • 1
    Не используйте expr в bash, bash может делать все, что может, и лучше. Первый "если" нет смысла, вы не проверяете, существует ли файл ... Наконец, цитируйте все расширения параметров; "$ foo" , а не $ foo . См. [D0] mywiki.wooledge.org/Arguments – geirha 10 March 2011 в 20:52

Другие вопросы по тегам:

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