ฉันจะเชื่อมตัวแปรเชลล์เข้ากับพารามิเตอร์อื่น ๆ ในบรรทัดคำสั่งของฉันได้อย่างไร


16

ฉันจะเชื่อมตัวแปรเชลล์เข้ากับพารามิเตอร์อื่น ๆ ในบรรทัดคำสั่งของฉันได้อย่างไร

ตัวอย่างเช่น,

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > $WEBSITE.sql

ฉันต้องเชื่อมต่อ.sqlกับ$WEBSITE

คำตอบ:


26

ใช้${ }เพื่อล้อมรอบตัวแปร

โดยไม่ต้องวงเล็บปีกกา:

VAR="foo"
echo $VAR
echo $VARbar

จะให้

foo

และไม่มีอะไรเพราะ$VARbarไม่มีตัวแปร

ด้วยวงเล็บปีกกา:

VAR="foo"
echo ${VAR}
echo ${VAR}bar

จะให้

foo
foobar

การปิดล้อมครั้งแรก$VARนั้นไม่จำเป็น แต่เป็นการฝึกฝนที่ดี

สำหรับตัวอย่างของคุณ:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword ${WEBSITE} > ${WEBSITE}.sql

งานนี้สำหรับbash, zsh, kshบางทีคนอื่นมากเกินไป


3
สิ่งนี้ใช้ได้กับเชลล์สไตล์ Bourne ทั้งหมด (Bourne, POSIX, bash, ksh, zsh), เชลล์ C-style (csh, tcsh) และแม้แต่ในปลาที่ไม่มีเครื่องหมายปีกกา ดังนั้นมันจึงเป็นสากลในบรรดากระสุนยูนิกซ์ ฉันจะไม่เรียกว่าการจัดฟันที่ดี แต่ฉันจะเรียกอย่างเป็นระบบโดยใช้เครื่องหมายคำพูดคู่รอบ ๆ การแทนตัวแปรที่ดี
Gilles 'หยุดชั่วร้าย'

1
@Gilles ผมไปต่อไปและบอกว่ากว่าไม่ได้ใช้คำพูดสองรอบแทนตัวแปรมาก ไม่ดีปฏิบัติ
Stéphane Chazelas

นอกจากนี้ดูแลที่${ }ไม่ได้ต่อกันในแง่ใด ตัวอย่างเช่นELP=elp && echo $ELP && man --h${EPL}ไม่ทำงาน
foki

4

เพียงต่อเนื้อหาตัวแปรเข้ากับสิ่งอื่นที่คุณต้องการเชื่อมต่อเช่น

/usr/bin/mysqldump --opt -u root --ppassword "$WEBSITE" > "$WEBSITE.sql"

การเสนอราคาสองครั้งไม่เกี่ยวข้องกับการต่อข้อมูล: ที่นี่>$WEBSITE.sqlก็ใช้ได้เหมือนกัน พวกเขาต้องการรอบการขยายตัวของตัวแปรเมื่อค่าของตัวแปรอาจมีอักขระพิเศษของเชลล์บางตัว (ช่องว่างและ\[?*) ฉันขอแนะนำให้ใส่อัญประกาศล้อมรอบการขยายตัวแปรและการแทนที่คำสั่งทั้งหมดเช่นเขียน"$WEBSITE"และ"$(mycommand)"เสมอ

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่$ VAR VS $ {} VAR และจะพูดหรือไม่ที่จะอ้าง


2

echo "$WEBSITE.sql"ผมมักจะใช้คำพูดเช่น

ดังนั้นคุณสามารถเขียนได้เช่น:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"

3
สิ่งนี้ใช้งานได้เนื่องจาก.ไม่ใช่อักขระที่ถูกต้องในชื่อตัวแปร ดูคำตอบของ wagถ้าคุณต้องการเชื่อมสตริงที่เริ่มต้นด้วยอักขระที่ถูกต้อง (เช่น "$ WEBSITEsql" จะไม่ทำงาน)
Michael Mrozek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.