สร้างตัวแปรและกำหนดค่าผ่านทางลูป (ทุบตี)


12

มีวิธีสร้างตัวแปร bash และกำหนดค่าผ่านลูปหรือไม่

บางสิ่งบางอย่างตาม:

#!/bin/bash

c=0
for file in $( ls ); do
    var"$c"="$file";
    let c=$c+1;
done

แก้ไข: ขอบคุณ @Costas และ @mdpc สำหรับการชี้ให้เห็นว่านี่จะเป็นทางเลือกที่ไม่ดีสำหรับรายการ คำถามเป็นเชิงทฤษฎีเท่านั้น


1
หมายเหตุ: โปรดทราบว่าการตั้งค่าของคุณจะเปลี่ยน / แก้ไข / กำหนดตัวแปรเฉพาะในกระบวนการปัจจุบันและไม่ใช่กระบวนการหลักหากคุณดำเนินการเป็นคำสั่ง คุณสามารถหาแหล่งไฟล์โดยใช้ '.' คำสั่ง (EX:. new_vars) เพื่อทำให้สิ่งนี้เกิดขึ้นภายในกระบวนการปัจจุบัน
mdpc

ตกลง แต่ข้างต้นไม่ทำงานจริง ๆ ; var"$c"ทำลายมัน คำตอบของ @Costas แสดงให้เห็นถึงวิธีการกำหนดค่าหลายค่าให้กับตัวแปรลิสต์เดียว - ฉันแค่ถามในทางทฤษฎีว่าตัวแปรสามารถสร้างขึ้นด้วยลูปได้หรือไม่
toxefa

อืม ... ทำไมซับซ้อนมากเพียงแค่ใช้ตัวแปรใหม่สร้างมันโดยไม่ต้องประโคม
mdpc

คำตอบ:


14

คุณสามารถใช้eval ได้ดังนี้:

c=0
for file in $( ls ); do
    eval "var$c=$file";
    c=$((c+1));
done

รหัสนี้จะสร้างตัวแปรชื่อ var0, var1, var2, ... โดยแต่ละไฟล์มีชื่อไฟล์ ฉันคิดว่าคุณจะมีเหตุผลที่ดีที่คุณต้องการทำเช่นนั้นโดยใช้อาร์เรย์ ...


5

เป็นไปได้ที่คุณหมายถึงอาร์เรย์ มีบางวิธีในการกำหนดค่า

ครั้งแรก:

c=0
for file in $( ls ); do
    var[$c]="$file";
    c=$(($c+1));
done

ประการที่สอง:

c=0
for file in $( ls ); do
    var[c++]="$file";
done

ที่สาม:

for file in $( ls ); do
    var[${#var}]="$file";
done

ที่สี่:

var=( $(ls) )

ที่ห้า

...

  1. ไม่จำเป็นต้องใช้lsเพียงแค่ใส่*ไฟล์ทั้งหมด
  2. ภายในสัญญาณสามารถ ommited[]$

ขอขอบคุณ; คำถามของฉันมีความเป็นไปได้ทางทฤษฎีมากกว่าการใช้งานจริง แต่เมื่อฉันecho $varกับคำสั่งที่คุณรายการข้างต้นผมเพียง แต่ได้รับไฟล์แรก ls'จดทะเบียนโดย ฉันกำลังทำอะไรผิดหรือเปล่า?
toxefa

1
หากคุณต้องการที่จะส่งออกอาร์เรย์ทั้งหมดที่คุณต้องใช้echo ${var[*]}(หรือ${var[@]}) echo ${var[1]}องค์ประกอบหนึ่งสามารถเรียกได้ว่าเหมือน หมายเหตุ: $varเท่ากับ${var[0]}
Costas

1
@ py4on วิธีอื่นคือใช้ loop:for v in "${var[@]}";do echo $v;done
Costas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.