ฉันต้องการแทรกค่า (สตริง) ในสคริปต์ที่ฉันจะอ่านจากไฟล์ข้อความ
ตัวอย่างเช่นแทนที่จะเป็น:
echo "Enter your name"
read name
ฉันต้องการอ่านสตริงจากไฟล์ข้อความอื่นดังนั้นล่ามควรอ่านสตริงจากไฟล์ไม่ใช่ที่ผู้ใช้ป้อน
ฉันต้องการแทรกค่า (สตริง) ในสคริปต์ที่ฉันจะอ่านจากไฟล์ข้อความ
ตัวอย่างเช่นแทนที่จะเป็น:
echo "Enter your name"
read name
ฉันต้องการอ่านสตริงจากไฟล์ข้อความอื่นดังนั้นล่ามควรอ่านสตริงจากไฟล์ไม่ใช่ที่ผู้ใช้ป้อน
คำตอบ:
หากต้องการอ่านตัวแปรจากไฟล์เราสามารถใช้คำสั่งsource
หรือ.
ให้ถือว่าไฟล์มีบรรทัดต่อไปนี้
MYVARIABLE="Any string"
จากนั้นเราสามารถนำเข้าตัวแปรนี้โดยใช้
#!/bin/bash
source <filename>
echo $MYVARIABLE
<filename>
นั้นจะถูกเรียกใช้ในเชลล์ของคุณเช่นrm -rf /
ซึ่งอาจเป็นอันตรายมาก
sed
เพื่อเพิ่มlocal
คำหลักและทำให้สคริปต์เป็นบิตที่ปลอดภัยและไม่ polute ขอบเขตทั่วโลกของคุณ ดังนั้นภายในฟังก์ชัน AA ทำแล้วใช้cat global_variables.sh | sed -e 's/^/local /' > local_variables.sh
. ./local_variables.sh
สิ่งที่คุณนำเข้าในฟังก์ชั่นจะมีให้เฉพาะในฟังก์ชั่นนั้น โปรดทราบว่ามันglobal_variables.sh
มีเพียงหนึ่งตัวแปรต่อบรรทัด
เมื่อพิจารณาว่าคุณต้องการให้เนื้อหาทั้งหมดในไฟล์ข้อความของคุณถูกเก็บไว้ในตัวแปรคุณสามารถใช้:
#!/bin/bash
file="/path/to/filename" #the file where you keep your string name
name=$(cat "$file") #the output of 'cat $file' is assigned to the $name variable
echo $name #test
หรือในทุบตีบริสุทธิ์:
#!/bin/bash
file="/path/to/filename" #the file where you keep your string name
read -d $'\x04' name < "$file" #the content of $file is redirected to stdin from where it is read out into the $name variable
echo $name #test
echo $name
ตกลงลบ ฉันใช้มันเพื่อการทดสอบ ถัดไปคุณสามารถใช้$name
ตัวแปรสำหรับการประมวลผลเพิ่มเติมทุกที่ที่คุณต้องการในสคริปต์ของคุณ
$name
ตัวแปรคือสตริงจากไฟล์ของคุณที่กำหนดโดยใช้cat $file
คำสั่ง อะไรไม่ชัดเจนหรือยากที่จะเข้าใจ
$file
ตัวแปรแยกหากคุณใช้เพียงครั้งเดียวเพื่อโหลด$name
ตัวแปรใช้cat /path/to/file
จากภายในสคริปต์ของคุณคุณสามารถทำได้:
read name < file_containing _the_answer
คุณสามารถทำได้หลายครั้งเช่นในวง
while read LINE; do echo "$LINE"; done < file_containing_multiple_lines
อีกวิธีหนึ่งในการทำเช่นนี้คือเพียงแค่เปลี่ยนเส้นทางอินพุตมาตรฐานไปยังไฟล์ของคุณซึ่งคุณมีอินพุตของผู้ใช้ทั้งหมดตามลำดับที่โปรแกรมคาดไว้ ตัวอย่างเช่นกับโปรแกรม (เรียกว่าscript.sh
)
#!/bin/bash
echo "Enter your name:"
read name
echo "...and now your age:"
read age
# example of how to use the values now stored in variables $name and $age
echo "Hello $name. You're $age years old, right?"
และไฟล์อินพุต (เรียกว่าinput.in
)
Tomas
26
คุณสามารถเรียกใช้จากเทอร์มินัลด้วยหนึ่งในสองวิธีต่อไปนี้:
$ cat input.in | ./script.sh
$ ./script.sh < input.in
และมันจะเทียบเท่ากับการเรียกใช้สคริปต์และป้อนข้อมูลด้วยตนเอง - มันจะพิมพ์บรรทัด "Hello Tomas คุณอายุ 26 ปีใช่มั้ย"
ในฐานะที่เป็นRadu Rădeanuได้แนะนำแล้วคุณสามารถใช้cat
ภายในสคริปต์ของคุณในการอ่านเนื้อหาของไฟล์ลงใน avariable ใช้ - ในกรณีที่คุณต้องการแต่ละไฟล์จะมีเพียงหนึ่งเส้นมีเพียงค่าที่คุณต้องการสำหรับตัวแปรเฉพาะที่ ในตัวอย่างข้างต้นคุณจะต้องแยกไฟล์อินพุตให้เป็นไฟล์เดียวกับชื่อ (พูด, name.in
) และอีกไฟล์หนึ่งเป็นไฟล์อายุ (พูด, age.in
) และเปลี่ยนread name
และและread age
บรรทัดเป็นname=$(cat name.in)
และage=$(cat age.in)
ตามลำดับ
vh=$(awk "NR==3 {print;exit}" /var/www/test.txt)
เปลี่ยนที่ จากนั้นคุณจะได้รับการบันทึกสตริงในตัวแปร$vh
ดังนั้นคุณสามารถใช้มันได้เช่น: mkdir "/var/www/$vh"
- สิ่งนี้จะสร้างโฟลเดอร์ที่มีชื่อที่ระบุไว้ภายใน / var / www
ฉันพบวิธีแก้ปัญหาการทำงานที่นี่: https://af-design.com/2009/07/07/loading-data-into-bash-variables/
if [ -f $SETTINGS_FILE ];then
. $SETTINGS_FILE
fi
name=$(<"$file")
จากman bash:1785
การทดแทนคำสั่งนี้เทียบเท่าname=$(cat "$file")
แต่เร็วกว่า
คำตอบสั้น ๆ :
name=`cat "$file"`
หากคุณต้องการใช้หลายสายคุณสามารถไปกับ:
path="/foo/bar";
for p in `cat "$path"`;
do echo "$p" ....... (here you would pipe it where you need it)
หรือ
หากคุณต้องการให้ผู้ใช้ระบุไฟล์
read -e "Specify path to variable(s): " path;
for p in 'cat "$path"';
do echo "$p" ............................
#! /bin/bash
# (GPL3+) Alberto Salvia Novella (es20490446e)
variableInFile () {
variable=${1}
file=${2}
source ${file}
eval value=\$\{${variable}\}
echo ${value}
}
variableInFile ${@}
ฉันใช้สิ่งนี้เพื่อรับตัวแปรเดียวจากไฟล์
GET_VAR=$(grep --color=never -Po "^${GET_VAR}=\K.*" "${FILE}" || true)
เมื่อGET_VAR
ไม่พบในมันจะว่างเปล่าแทนที่จะก่อให้เกิดข้อผิดพลาดขอบคุณไป${FILE}
|| true
มันใช้grep -P
ซึ่งอยู่ใน grep GNU แต่ไม่ได้เริ่มต้นใน grep ทั้งหมดในเวลาที่เขียนนี้
KEY=VALUE
จับคู่? การแก้ปัญหาจะแตกต่างกันมาก (ถ้าเป็นหลังคำตอบของ Takkat ใช้อดีตของ Radu)