จะเปลี่ยนค่าของอาร์กิวเมนต์ในสคริปต์ได้อย่างไร?


11

ฉันลองใช้สคริปต์ง่ายๆขนาดเล็กต่อไปนี้:

#!/bin/bash
$1="bar"
echo $1

แต่เมื่อฉันเรียกใช้./script fooฉันได้รับข้อผิดพลาดและค่าจะไม่เปลี่ยนแปลง:

/home/mika/script: line 2: foo=bar: command not found
foo

ฉันรู้ว่า $ 1 คืออาร์กิวเมนต์แรกที่คุณส่งผ่านไปยังสคริปต์ของคุณ แต่ถึงอย่างนี้ฉันก็ต้องการเปลี่ยนค่าของมัน


คำตอบ:


10

คุณสามารถใช้ builtin set:

#!/bin/bash
set -- "bar"
echo $1

แหล่งที่มาและเพิ่มเติมเกี่ยวกับ: เปลี่ยนอาร์กิวเมนต์บรรทัดคำสั่ง - ทุบตี


ฉันลองมัน แต่มันก็ยังสะท้อน "ฟู" คุณได้รับผลลัพธ์ที่แตกต่างกันอย่างไร อย่าลืมส่ง "foo" ไปที่สคริปต์
Marty ผัด

@MartyFried Ups ขออภัย ... ฉันเพิ่งอัพเดตคำตอบ
Radu Rădeanu

ที่ได้ผล :-) คำตอบที่ดี ... ฉันคิดว่าฉันคิดว่าเขาไม่ต้องการทำอย่างนั้นและฉันไม่แน่ใจว่าทำไมเขาถึงทำ แต่คำตอบของคุณถูกต้องกว่าคำแนะนำของฉันที่จะไม่ทำ ขอบคุณสำหรับลิงค์
Marty ผัด

4

คุณไม่สามารถเปลี่ยนตัวแปรเหล่านั้นโดยตรง คุณสามารถพูดได้:

x=$1
echo $x

จากนั้นคุณสามารถใช้$xแทน

การใช้$1=barจะแทนที่พารามิเตอร์แรกทันที$1และคุณจำเป็นต้องระบุ"foo=bar"และมันถูกตีความว่าเป็นคำสั่ง "foo" ไม่ใช่ตัวแปร "foo";


เป็นแนวคิดที่ดี แต่ขึ้นอยู่กับสิ่งที่ต้องการให้ OP บรรลุ ... +1 จากฉัน
Radu Rădeanu

2

อย่าใช้$1สำหรับสิ่งนี้ในbashและเชลล์อื่น ๆ$1เป็นอาร์กิวเมนต์แรกที่คุณส่งไปยังสคริปต์ของคุณ:

#!/bin/bash
echo $1

หากคุณเรียกใช้ข้างต้นเป็นfoo.sh helloมันจะพิมพ์helloตั้งแต่นั้นเป็นอาร์กิวเมนต์ที่ 1 นอกจากนี้คุณหมายถึงตัวแปรที่เป็นvarและตัวแปรของเนื้อหา$varเป็น ดังนั้นเพื่อให้ได้พฤติกรรมตามที่คุณคาดหวังเพียงใช้ชื่ออื่นสำหรับตัวแปรของคุณและอย่าใช้$:

#!/bin/bash
var="bar"
echo $var

สคริปต์ขนาดเล็กนี้เป็นเพียงตัวอย่างเพื่อให้ผู้คนเข้าใจในสิ่งที่ฉันต้องการ ฉันรู้ว่า $ 1 คืออาร์กิวเมนต์แรกที่คุณส่งผ่านไปยังสคริปต์ของคุณ แต่ถึงอย่างนี้ฉันก็ต้องการเปลี่ยนค่าของมัน ฉันต้องใช้มันในสคริปต์ตัวใหญ่อีกตัว ขอบคุณ.
user258266

@ user258266 ทำไม่ได้ เพียงเรียกสคริปต์ตัวใหญ่ด้วยค่าใหม่อย่าใช้$1สำหรับค่าที่คุณต้องการเปลี่ยน $อย่างไรก็ตามตราบใดที่คุณแก้ไขข้อผิดพลาดทางไวยากรณ์ก็ควรทำงานคุณปัญหาหลักคือการที่คุณใช้
terdon

แต่ฉันต้องการ ... ฉันไม่สามารถอธิบายได้ที่นี่ทำไม ... บางทีฉันอาจจะแก้ไขคำถามของฉัน
user258266

@ user258266 โปรดทำ คุณพยายามที่จะตั้งค่าตัวแปรเป็น$foo="bar"ที่ไม่ได้ทำงานที่คุณต้องการโดยไม่ต้องfoo="bar" $
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.