Score:2

ประเมินสตริง ```$((expression))```-like และบันทึกในตัวแปร

ธง in

สิ่งนี้อาจฟังดูค่อนข้างงุ่มง่ามสำหรับพวกคุณบางคน สมมติว่าฉันมีสตริงที่แสดงถึงบางอย่าง $((นิพจน์))นิพจน์เลขคณิต เช่น '$((1+1))'. ฉันต้องการดำเนินการและส่งผลลัพธ์ไปยังตัวแปร

ตัวอย่าง:

$ expression='$((5+5))'
$ สะท้อน $ การแสดงออก 
'$((5+5))'

$ # ผลลัพธ์ที่คาดหวัง: 10

ฉันจะประเมินสตริงนั้นและจัดเก็บผลลัพธ์ได้อย่างไร

Bruno Henrique Peixoto avatar
in flag
โอ้ ฉันอาจจะทำพาสต้าอร่อยๆ จากความผิดพลาดของมาการอง ขอบคุณ!
Score:1
ธง jp

หากคุณกำลังประเมินสตริง ลอง อีวาล.

str="$[ 5 + 5 ]"
eval "numb=$str" # กลายเป็น `numb=$[ 5 + 5 ]`
echo $numb # เอาต์พุต 10

อีวาล สามารถเรียกใช้งานสตริงได้ราวกับว่าเป็นเชลล์โค้ด ระวัง! ถ้า $str สามารถมีอักขระพิเศษได้ ซึ่งอาจทำให้สคริปต์ของคุณเสียหายหรือแม้แต่สร้างช่องโหว่ด้านความปลอดภัย

Score:0
ธง cn

หากเป็นจริงทางคณิตศาสตร์ โดยเฉพาะอย่างยิ่งหากเกี่ยวข้องกับเลขจำนวนเต็มอย่างง่าย คุณสามารถใช้รูปแบบที่คุณมี:

$ var=$((1+1))
$echo "$var"
2

เช่นเดียวกันหากเป็นคำสั่ง ตัวอย่างเช่น การคำนวณทางคณิตศาสตร์ที่ซับซ้อนขึ้นเล็กน้อยสามารถทำได้โดยการไพพ์ไปที่ พ.ศ:

## งานคณิตศาสตร์จำนวนเต็มอย่างง่าย
$ เสียงสะท้อน $((3 * 2))
6
## เศษส่วนล้มเหลว
$ เสียงสะท้อน $((1.3 * 2))
ทุบตี: 1.3 * 2: ข้อผิดพลาดทางไวยากรณ์: ตัวดำเนินการทางคณิตศาสตร์ไม่ถูกต้อง (โทเค็นข้อผิดพลาดคือ ".3 * 2")
## bc ทำงาน
$ echo "1.3 * 2" | พ.ศ
2.6

ดังนั้นหากต้องการเก็บค่านั้นไว้ในตัวแปร คุณก็แค่ใช้ค่ามาตรฐาน การแทนที่คำสั่ง:

$ var=$(เสียงสะท้อน "1.3 * 2" | bc)
$echo "$var"
2.6

ในที่สุดคุณก็มี อีวาล ในตัว (ดู ช่วยด้วย ใน ทุบตี):

$ ช่วย eval
eval: eval [หาเรื่อง ...]
    ดำเนินการอาร์กิวเมนต์เป็นคำสั่งเชลล์
    
    รวม ARGs เป็นสตริงเดียว ใช้ผลลัพธ์เป็นอินพุตไปยังเชลล์
    และดำเนินการตามคำสั่งที่ได้
    
    สถานะทางออก:
    ส่งคืนสถานะการออกของคำสั่งหรือสำเร็จหากคำสั่งเป็นโมฆะ
Score:0
ธง sd

เพียงเก็บไว้ในตัวแปรเหมือนที่คุณทำตามปกติ

ผลลัพธ์ $=$((5+5))
$ สะท้อน $ ผลลัพธ์ 
10

ถ้านี่ไม่ใช่สิ่งที่คุณหมายถึง แก้ไข โพสต์ของคุณและโพสต์ข้อมูลเพิ่มเติม

Bruno Henrique Peixoto avatar
in flag
ฉันอัปเดตคำถามเพื่อให้คดีของฉันดีขึ้น แต่ฉันขอขอบคุณสำหรับคำตอบ! :-)
jp flag
Dan
@BrunoHenriquePeixoto ในการแก้ไขของคุณ คุณใช้รหัสเดียวกันเกือบทั้งหมด คำตอบนี้เป็นสิ่งที่คุณต้องการในกรณีนี้ ข้อผิดพลาดเดียวที่คุณมีคือการใช้เครื่องหมายคำพูดในส่วน `$((5+5))` คุณต้องลบออก
Bruno Henrique Peixoto avatar
in flag
การดำเนินการที่ฉันต้องประเมินมีเครื่องหมายคำพูด จากนั้นฉันเกรงว่าจะประเมินพวกเขาไม่ได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา