Bir değişkeni dosyadan nasıl okurum?


68

Komut dosyasına bir metin dosyasından okuyacağım bir değer (dize) eklemek istiyorum.

Örneğin, yerine:

echo "Enter your name"
read name

Başka bir metin dosyasından bir dize okumak istiyorum, böylece tercüman kullanıcı girdisini değil, dosyadaki dizeyi okumalıdır.


1
Metin dosyanız neye benziyor? Tüm dosya 1 değişken KEY=VALUEmi yoksa çiftler mi? Çözümler oldukça farklı (ikincisi ise, Takkat'ın cevabı eski Radu'nun cevabı geçerlidir)
kiri

1
@CiroSantilli, farklı bir kullanıcı tarafından gönderilmişse crossposted değildir, "siteler arası kopya" diye bir şey yoktur. Kaçınılması gereken tek şey , aynı kullanıcı tarafından farklı sitelerde sorulan aynı soru .
terdon

Yanıtlar:


98

Bir dosyadaki değişkenleri okumak için sourceveya .komutunu kullanabiliriz .

Dosyanın şu satırı içerdiğini varsayalım

MYVARIABLE="Any string"

sonra bu değişkeni kullanarak alabiliriz

#!/bin/bash

source <filename>
echo $MYVARIABLE

16
Bu şekilde yapmak istememenizin bir nedeni <filename>, kabuğunuzda ne olursa olsun , örneğin rm -rf /çok tehlikeli olabileceği gibi çalıştırılacak olmasıdır .
Mark Ribau,

3
Partiye geç kaldı, ama hayır, cevap olarak VEYA işaretlenmesini hak etmiyor. Bu, OP'nin istediği gibi olmayan başka bir bash kaynak dosyasını sağlar. Bir DOSYA içeriğini bir değişkene nasıl okuyacağımı sordu. Bir değişken ayarlayan başka bir betiğin nasıl çalıştırılacağını DEĞİL . Doğru cevap, aşağıdaki cevaptır. name = $ (kedi "$ dosya").
HörmannHH

2
OTOH, sorduğum sorunun cevabı google ve google beni buraya getirdi. Tuhaf zamanlar ha?
Michael Terry

1
Harika, aynı zamanda birden fazla değişken için çalışıyor! @MarkRibau Noktası anlaşılıyor ancak dosyayı farklı bir komut dosyasında düzeltmek ve sadece para cezası ve kontrolünün üzerinden geçmek zorunda kaldığınızı tahmin ediyorum.
madlymad

1
Anahtar kelime sedeklemek localve komut dosyasını biraz daha güvenli hale getirmek için kullanabilirsiniz . Yani içinde aa işlevi yapın cat global_variables.sh | sed -e 's/^/local /' > local_variables.shve kullanın . ./local_variables.sh. İşlevde içe aktardığınız ne olursa olsun, yalnızca bu işlevde kullanılabilir. global_variables.shHer satıra yalnızca bir değişken içerdiğini varsayalım .
Nux,

55

Metin dosyanızın tüm içeriğinin değişkeninizde tutulmasını istediğinizi göz önünde bulundurarak şunları kullanabilirsiniz:

#!/bin/bash

file="/path/to/filename" #the file where you keep your string name

name=$(cat "$file")        #the output of 'cat $file' is assigned to the $name variable

echo $name               #test

Veya, saf bash'ta:

#!/bin/bash

file="/path/to/filename"     #the file where you keep your string name

read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable

echo $name                   #test

Değişkeni görüntülemek istemiyorum, bu değişkenin ileri işleme için komut dosyası tarafından okunmasını istiyorum. Satır satır okuyan awk denedim.
user208413

1
Tamam, sil echo $name . Sadece test için kullanıyorum. Daha $namesonra betiğinizde istediğiniz herhangi bir yerde daha fazla işlem yapmak için değişkeni kullanabilirsiniz .
Radu Rădeanu

Betiğimde hiçbir yerde kullanamıyorum, çünkü betiği değişkenin değerini bilmiyor. Bizim durumumuzda değişken ismi.
user208413,

6
@ user208413 $nameDeğişken değeri, cat $filekomutunu kullanarak atanan dosyanızdaki dizektir . Neyin net olmadığı veya anlaşılması zor olan ne?
Radu Rădeanu

1
$fileDeğişkeni yüklemek için yalnızca bir kez kullanıyorsanız, ayrı bir değişken kullanmak gereksizdir $name, sadece kullanıncat /path/to/file
kiri

11

Komut dosyanızın içinden bunu yapabilirsiniz:

read name < file_containing _the_answer

Bunu bir defada yapabilirsiniz, örneğin bir döngüde

while read LINE; do echo "$LINE"; done < file_containing_multiple_lines

veya her satırda birden fazla öğenin bulunduğu bir dosya için. . . grep -v ^ # dosya | abc okunurken; echo a = $ ab = $ bc = $ c; bitmiş
gaoithe

7

Bunu yapmanın alternatif bir yolu da, standart girdiyi, tüm kullanıcı girişini programın beklediği sırada aldığınız dosyaya yönlendirmek olacaktır. Örneğin, programla (çağrılan script.sh)

#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age

# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"

ve giriş dosyası (denir input.in)

Tomas
26

Bunu terminalden aşağıdaki iki yoldan biriyle çalıştırabilirsiniz:

$ cat input.in | ./script.sh
$ ./script.sh < input.in

ve sadece betiği çalıştırmak ve verileri manuel olarak girmekle aynı olacaktır - "Merhaba Tomas. 26 yaşındasın, değil mi?" satırını yazdıracaktı.

As Radu Rădeanu gelmiştir zaten önerilen şunu kullanabilirsiniz catbir değişken bir bir dosyanın içeriğini okumak için komut dosyası içinde - bu durumda, Eğer bu özel değişken için yalnızca istediğiniz değere sahip, tek bir satır içerecek şekilde her dosyayı gerekir. Yukarıdaki örnekte, giriş dosyasını bir adla (say, name.in) ve bir yaşla (say, age.in) ayırır ve sırasıyla read nameve read agesatırlarını ve satırlarını değiştirirsiniz .name=$(cat name.in)age=$(cat age.in)


Aşağıdaki betiğe sahibim: vh = awk "NR == 3 {print; exit}" /var/www/test/test.txt bununla satır 3'ü test.txt adlı metin dosyasından okudum. Bir dize aldıktan sonra bu dizeyi dizin oluşturmak için bir girdi olarak kullanmak istiyorum
user208413

1
Bunu olarak değiştir vh=$(awk "NR==3 {print;exit}" /var/www/test.txt). Daha sonra değişkende kayıtlı bir dizgeye sahip olacaksınız $vh, böylece onu böyle kullanabilirsiniz: mkdir "/var/www/$vh"- bu, / var / www içinde belirtilen isimde bir klasör yaratacaktır.
Tomas Aschan

Bu şekilde yaptım ama hala klasörü oluşturamıyor :(
user208413 28:13

@ user208413: Hangi hata mesajlarını alıyorsunuz? "İşe yaramaz", ne yazık ki, çok yararlı bir sorun açıklaması değil ...
Tomas Aschan


3
name=$(<"$file") 

Gönderen man bash:1785bu komut ikamesi eşdeğerdir name=$(cat "$file")ancak daha hızlı.



0

Birden çok dize kullanmak istiyorsanız, şununla gidebilirsiniz:

path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it) 

VEYA

Kullanıcının dosyayı belirtmesini istiyorsanız

read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................

0
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


variableInFile ${@}

0

Bunu bir dosyadan tek bir değişken almak için kullanıyorum

GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)

İçinde GET_VARbulunmadığı zaman ${FILE}hataya sebep olmak yerine boş kalır || true.

grep -PGNU grep'te bulunan, ancak yazma sırasındaki tüm greplerde varsayılan olmayanı kullanır .


Bu benim için çalışmıyor gibi görünüyor. İlk $, geçersiz karakter için bir hata veriyor
ginna
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.