คำถามติดแท็ก variable-substitution

1
การแทนที่ $ {! var_name + x} หมายถึงอะไร
ฉันพบสคริปต์ที่มีฟังก์ชันที่ตรวจสอบว่ามีการตั้งค่าตัวแปร แต่ฉันไม่เข้าใจมันเป็นอย่างดี check_if_variable_is_set() { var_name=$1 if [ -z "${!var_name+x}" ]; then false else true fi } เกิดอะไรขึ้นกับการทดแทนนี้

3
การแทนที่คำสั่งสามารถซ้อนในการแทนที่ตัวแปรได้หรือไม่?
ฉันต้องการใช้การทดแทนตัวแปรบนสตริงเฉพาะที่ฉันเข้าถึงผ่านคำสั่ง ตัวอย่างเช่นหากฉันคัดลอกบางสิ่งลงในคลิปบอร์ดของฉันฉันสามารถเข้าถึงได้เช่นนี้ $ xclip -o -selection clipboard Here's a string I just copied. หากฉันกำหนดให้กับตัวแปรดังนั้นฉันสามารถทำการทดแทนตัวแปรได้ $ var=$(xclip -o -selection clipboard) $ echo $var Here's a string I just copied. $ echo ${var/copi/knott} Here's a string I just knotted. อย่างไรก็ตามมีวิธีการเปลี่ยนตัวแปรโดยไม่ต้องกำหนดให้กับตัวแปรหรือไม่? แนวคิดบางอย่างเช่นนี้ $ echo ${$(xclip -o -selection clipboard)/copi/knott} bash: ${$(xclip -o -selection clipboard)/copi/knott}: …

2
ผนวกกับตัวแปรที่เหมือนกับ PATH โดยไม่สร้างโคลอนนำถ้าไม่ได้ตั้ง
PKG_CONFIG_PATHฉันจำเป็นต้องผนวกไดเรกทอรีที่ โดยปกติฉันจะใช้มาตรฐาน export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:$(pyenv prefix)/lib/pkgconfig แต่PKG_CONFIG_PATHก่อนหน้านี้ไม่ได้ตั้งค่าไว้ในระบบของฉัน ดังนั้นตัวแปรจึงเริ่มต้นด้วย:ตัวอักษรซึ่งบอกให้ค้นหาในไดเรกทอรีปัจจุบันก่อน ฉันไม่ต้องการสิ่งนั้น. ฉันตัดสินต่อไปนี้ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}${PKG_CONFIG_PATH:+:}$(pyenv prefix)/lib/pkgconfig แต่ดูเหมือนว่าน่าเกลียดมาก มีวิธีที่ดีกว่า? อะไรคือวิธีที่เหมาะสมในการต่อท้ายโคลอนแบบมีเงื่อนไขถ้าหากว่าตัวแปรถูกตั้งค่าแล้ว?

3
ฉันจะส่งผ่านอาร์กิวเมนต์ที่เก็บไว้ในตัวแปรไปยัง WGET ได้อย่างไร
ฉันกำลังเขียนสคริปต์ทุบตีที่ใช้ wget อย่างกว้างขวาง เพื่อกำหนดพารามิเตอร์ทั่วไปทั้งหมดในที่เดียวฉันเก็บไว้ในตัวแปร นี่คือรหัสชิ้นหนึ่ง: useragent='--user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"' cookies_file="/tmp/wget-cookies.txt" save_cookies_cmd="--save-cookies $cookies_file --keep-session-cookies" load_cookies_cmd="--load-cookies $cookies_file --keep-session-cookies" function mywget { log "#!!!!!!!!!# WGET #!!!!!!!!!# wget $quiet $useragent $load_cookies_cmd $@" wget $useragent $load_cookies_cmd "$@" } Saddly ไม่ทำงาน ยังไงก็เถอะฉันขาดวิธีที่ถูกต้องในการจัดเก็บพารามิเตอร์กับตัวแปร $ useragent, $ save_cookies_cmd, $ load_cookies_cmd และ caling wget ผ่าน …

10
Bash: แยกหนึ่งในสี่ส่วนของที่อยู่ IPv4
เราสามารถใช้ไวยากรณ์${var##pattern}และ${var%%pattern}แยกส่วนสุดท้ายและส่วนแรกของที่อยู่ IPv4: IP=109.96.77.15 echo IP: $IP echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*} echo 'Extract the last section using ${var##pattern}: ' ${IP##*.} เราจะแยกส่วนที่สองหรือสามของที่อยู่ IPv4 โดยใช้การขยายพารามิเตอร์ได้อย่างไร นี่คือโซลูชันของฉัน: ฉันใช้อาร์เรย์และเปลี่ยนตัวแปร IFS :~/bin$ IP=109.96.77.15 :~/bin$ IFS=. read -a ArrIP<<<"$IP" :~/bin$ echo ${ArrIP[1]} 96 :~/bin$ printf "%s\n" "${ArrIP[@]}" 109 96 77 15 นอกจากนี้ผมได้เขียนแก้ปัญหาบางอย่างใช้awk, …

2
หากต้องการหาบรรทัดที่ถูกต้องลองเปลี่ยนเนื้อหาแล้วใส่กลับเข้าไปในไฟล์ต้นฉบับหรือไม่
ฉันพยายามที่จะเปลี่ยนคำเดียวในบรรทัดที่ระบุในไฟล์ แต่ฉันมีปัญหาในการเชื่อมต่อทั้งหมดเข้าด้วยกัน โดยพื้นฐานแล้วในหนึ่งบรรทัดในไฟล์ของฉันมีคำสำคัญ 'firmware_revision' และในบรรทัดนี้ (และเฉพาะบรรทัดนี้) ฉันต้องการแทนที่คำว่า 'ทดสอบ' ด้วยคำว่า 'การผลิต' ดังนั้นฉันสามารถทำสิ่งนี้: grep 'firmware_revision' myfile.py | sed 's/test/production' นี่จะเป็นการเลือกบรรทัดที่ฉันต้องการและทำการทดแทน แต่ฉันไม่สามารถหาวิธีนำบรรทัดใหม่นี้ไปยังไฟล์ต้นฉบับเพื่อแทนที่บรรทัดเก่าได้ เห็นได้ชัดว่าฉันไม่สามารถเปลี่ยนเส้นทางกลับไปที่ไฟล์ดังนั้นฉันควรทำอย่างไร แม้ว่าฉันใช้ temporaries โดยใช้grepเพื่อรับสายฉันต้องฉันสูญเสียข้อมูลอื่น ๆ ในไฟล์ดังนั้นฉันไม่สามารถเพียงแค่เปลี่ยนมันทั้งหมดไปยังไฟล์ temp แล้วแทนที่เดิมด้วย temp แก้ไข - มีคนถามข้อมูลเพิ่มเติม ให้บอกว่าฉันมีไฟล์เต็มบรรทัดเช่นนี้ [ ('key_name1', str, 'value1', 'Description'), ('key_name2', str, 'value2', 'Description'), ('key_name3', str, 'value3', 'Description'), ('firmware_revision', str, 'my-firmware-name-test', 'Firmware revision …

2
Piping string manipulation
ฉันได้อ่านคำถามเกี่ยวกับการจัดการสตริงทุบตี bash อื่น ๆ แต่ดูเหมือนจะเป็นแอปพลิเคชันพิเศษ เป็นหลักมีวิธีการทำด้านล่างง่ายขึ้น? แทน $ string='hello world'; string2="${string// /_}"; echo "${string2^^}" HELLO_WORLD สิ่งที่ต้องการ $ echo 'hello world' | $"{-// /_}" | "${ -^^}" HELLO_WORLD แก้ไขฉันสนใจที่จะอยู่ในการควบคุมของ bash หากเป็นไปได้เพื่อรักษาความเร็ว (ตรงข้ามกับ sed / awk ซึ่งมีแนวโน้มที่จะทำให้สคริปต์ของฉันช้าลงอย่างมาก) แก้ไข 2: @jimmij ฉันชอบตัวอย่างที่สองและทำให้ฉันทำฟังก์ชั่น bash_m() { { read x; echo "${x// /_}"; } | { …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.