Değişken adıyla değişkenleri tanımlama


11

Bu senaryoda yanlış olan ne? A1 = 1, B1 = 1, C1 = 1 tanımlamaya çalışıyorum

LIST="A B C"
for x in $LIST
do
    "$x"1=1
done

ve sonuç:

./x.: line 7: A1=1: command not found
./x.: line 7: B1=1: command not found
./x.: line 7: C1=1: command not found

1
Bash'da böyle değişkenler oluşturabileceğinizi sanmıyorum. Diziler bunun için.
Jakuje

3
Kullanın eval "$x"1=1. Jakuje'nin belirttiği gibi, diziler muhtemelen bu durum için daha uygundur.
Andrea Corbellini

@AndreaCorbellini Bunu bir cevap olarak yazmalısınız.
Sparhawk

Yanıtlar:


21

Değişken ataması, değişken adı, ardından eşittir işaretini ve ardından (isteğe bağlı) değeri içerir.

Bu geçerli bir ödev:

ABC=123

"$x"1=1"$x"1değişken bir ad olmadığından geçerli bir ödev değil. Olabilir eval bir değişken adına uated, ama değil. Kabuk aslında bunun bir emir olduğuna inanıyor.

Ulaşmak istediğiniz şeyi yapmanın bir yolu şudur:

eval "$x"1=1

Bash'taki başka bir yol (ancak diğer kabuklarda değil):

declare "$x"1=1

Ya da (yine sadece bash):

let "$x"1=1

(Davanızda çok fazla fark yok.)

Ancak, Jakuje'nin yorumlarda belirttiği gibi , kabuğunuzda (ksh, bash veya zsh) varsa muhtemelen dizilerle gitmek istersiniz.


Tamamlamak için:

  • evalisteğe bağlı komutları yürütür. Eşittir işaretinin sağ tarafında bazı komutlara genişleyen bir değişken varsa, bu komut yürütülür. Aşağıdaki kod:

    x=a
    y='$(echo hello)'
    eval "$x=$y"

    eşittir a=hello.

  • declaredeğişken atamak için bir bash yerleşiktir ve herhangi bir komut yürütmez. Aşağıdaki kod:

    x=a
    y='$(echo hello)'
    declare "$x=$y"

    eşittir a='$(echo hello)'.

  • let, declarekomutları yürütmediği için benzerdir . Ancak, aksine declare, letaritmetik işlemler için kullanılabilir:

    let a="1 + 2"

    eşittir a=3.


Even ABC = 123geçersiz. Çünkü equal(=)işaretin önüne ve arkasına boşluk eklenir .
Mahendran Sakkarai

3

Bash SSS'nin dolaylı olarak bir girişi var. Çoğu kullanım durumunda, aslında yapmanız gereken ilişkilendirilebilir veya dizine alınmış bir dizi kullanmaktır. Ayrıca kullanabilirsiniz

func_call_by_reference() { # Bash 4.3
    typeset -n ref=$1   # nameref to the variable named by the caller
    ref=( "val1" "val2" ... )  # return an array by reference
}

Dağınık evalalıntıdan kaçınırken bunu yapmak için daha fazla seçenek için bu SSS girişine bakın .


0

Aşağıdaki gibi bir kod kullanabilirsiniz. Kod kabuğunuzda "$x"1=1geçerli bir değişken ataması olmadığı için komut olarak yürütülür.

LIST="A B C"
for x in $LIST
do
    a=$(echo "$x"1)
    let $a=1
done

Hangi kabuğu kullanıyorsun? Bosh bash 4.1.7 ve 4.3.11 kullanarak command not found <varname>=1Bunu yapmaya çalıştığımda hatalar alıyorum (açıkçası <varname> içinde sakladığım değer olarak a)
Eric Renouf

@Andrea Corbellini tarafından açıklandığı gibi, değer atamak için izin, beyan veya değerlendirme kullanmak zorunda ..
AVJ

1
echoburada ihtiyacın yok! Sadece a="$x"1. Ayrıca letaritmetik bir bağlamdır, bu yüzden sadece onunla numara atayabilirsiniz.
Peter Cordes

declare $a=foobarİşler.
Peter Cordes
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.