คำถามติดแท็ก parameter

7
พิมพ์อาร์กิวเมนต์ของเชลล์ในลำดับย้อนกลับ
ฉันติดอยู่นิดหน่อย งานของฉันคือการพิมพ์อาร์กิวเมนต์ไปยังสคริปต์ของฉันในลำดับย้อนกลับยกเว้นที่สามและสี่ สิ่งที่ฉันมีคือรหัสนี้: #!/bin/bash i=$# for arg in "$@" do case $i in 3) ;; 4) ;; *) eval echo "$i. Parameter: \$$i";; esac i=`expr $i - 1` done ในขณะที่ฉันเกลียด eval (ทักทาย PHP) ฉันกำลังมองหาวิธีการแก้ปัญหาโดยไม่ได้ทำ แต่ฉันไม่สามารถหามันได้ ฉันจะกำหนดตำแหน่งของการโต้แย้งแบบไดนามิกได้อย่างไร PS: มันไม่ใช่การบ้านฉันกำลังเรียนรู้การทำข้อสอบดังนั้นฉันจึงพยายามแก้ข้อสอบเก่า

2
พารามิเตอร์ทางเลือกในฟังก์ชั่นทุบตี
ฉันมีฟังก์ชั่นสำหรับการสร้างสาขา SVN ใหม่ที่รวดเร็ว function svcp() { svn copy "repoaddress/branch/$1.0.x" "repoaddress/branch/dev/$2" -m "dev branch for $2"; } ซึ่งฉันใช้เพื่อสร้างสาขาใหม่อย่างรวดเร็วโดยไม่ต้องค้นหาและคัดลอกวางที่อยู่และสิ่งอื่น ๆ อย่างไรก็ตามสำหรับข้อความ (ตัวเลือก -m) ฉันต้องการที่จะให้มันถ้าฉันให้พารามิเตอร์ที่สามจากนั้นที่จะใช้เป็นข้อความมิฉะนั้นข้อความ 'เริ่มต้น' ของ "dev สาขาราคา $ 2" บางคนสามารถอธิบายวิธีการนี้ได้หรือไม่

1
ทุบตีนามแฝงที่มีช่องว่างเป็นส่วนหนึ่งของคำสั่ง
ฉันพยายามที่จะสร้างนามแฝงทุบตีที่ชื่อแทนตัวเองมีช่องว่างในนั้น ความคิดคือนามแฝง (คือcon) sudo openvpn --config /path/to/my/openvpn/configs/ย่อมาจาก ซึ่งส่งผลให้คำสั่งอ่านได้เมื่อใช้conนามแฝง เช่น: `con uk.conf` == `sudo openvpn --config /path/to/my/openvpn/configs/uk.conf` con ="sudo openvpn --config /path/to/my/openvpn/configs/"ฉันเข้าใจว่าฉันไม่สามารถประกาศนามแฝงเช่นนี้ ฟังก์ชั่นทุบตีจะทำงานในสถานการณ์นี้หรือไม่ ฉันไม่เคยได้ยินเรื่องนี้มาก่อน แต่เมื่อค้นคว้าวิธีแก้ปัญหาสำหรับปัญหาเล็กน้อยนี้

2
นับจำนวนองค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร)
คำชี้แจงสั้น ๆ ของคำถาม: มีวิธีการทุบตีในตัวเพื่อนับจำนวนขององค์ประกอบในอาร์เรย์ทุบตีที่ชื่อของอาร์เรย์เป็นแบบไดนามิก (เช่นเก็บไว้ในตัวแปร) โดยไม่ต้องหันไปทำสำเนาอย่างเต็มที่ของอาร์เรย์หรือใช้eval? ข้อมูลมากกว่านี้: การใช้การแทนที่พารามิเตอร์ bash สามารถทำได้ดังนี้: myArr=(A B C); echo ${#myArr[@]}กำหนดความยาวของอาร์เรย์: การอ้างอิงตัวแปรทางอ้อมโดยใช้ชื่อ: NAME=myVar; echo ${!NAME}(สิ่งนี้ยังใช้กับองค์ประกอบอาร์เรย์): NAME=myArr[1]; echo ${!NAME} แต่ถ้าชื่อของอาเรย์ถูกเก็บไว้ในตัวแปรอีกตัวหนึ่งจะกำหนดจำนวนขององค์ประกอบในอาเรย์ได้อย่างไร? (หนึ่งอาจพิจารณาว่าเป็นการรวมกันของการแทนที่พารามิเตอร์สองตัวด้านบน) ตัวอย่างเช่น: myArr=(A B C D) NAME=myArr # Get the number of elements in the array indirectly referenced by NAME. count=${#$NAME[@]} # This syntax is invalid. What …

5
การทำดัชนีและการปรับเปลี่ยนอาร์เรย์พารามิเตอร์ Bash $ @
เป็นไปได้$@หรือไม่ที่จะอ้างถึงดัชนีใน ฉันไม่พบการอ้างอิงใด ๆ ที่จะใช้สิ่งต่อไปนี้ในวิกิของ GrayCatและคู่มือการใช้สคริปต์ขั้นสูงและอื่น ๆกำหนดค่านี้ให้กับตัวแปรที่แตกต่างกันก่อนที่จะทำการแก้ไขแทน $ echo ${@[0]} -bash: ${@[0]}: bad substitution เป้าหมายคือDRY : อาร์กิวเมนต์แรกใช้สำหรับสิ่งหนึ่งและส่วนที่เหลือเป็นอย่างอื่นและฉันต้องการหลีกเลี่ยงการทำซ้ำรหัสเพื่อทำให้เป็นมาตรฐาน$@อาร์เรย์หรือเพื่อสร้างฟังก์ชันแยกต่างหากสำหรับสิ่งนี้ ชี้ว่ามันอาจเป็นวิธีที่ง่ายที่สุด) ชี้แจง: วัตถุคือการปรับเปลี่ยนค่าของความยาวตัวแปร $@เพื่อให้รหัสง่ายต่อการตรวจแก้จุดบกพร่อง เวอร์ชันปัจจุบันค่อนข้างแฮ็คเกินไปสำหรับความชอบของฉันแม้ว่ามันจะทำงานได้แม้ในเส้นทางที่แปลกประหลาดเช่น $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n' อัปเดต : ดูเหมือนว่าจะเป็นไปไม่ได้ รหัสนี้ใช้ทั้งรหัสและการทำสำเนาข้อมูล แต่อย่างน้อยก็ใช้งานได้: path_common() { # Get the deepest common path. local common_path="$(echo -n "${1:-}x" | tr -s '/')" common_path="${common_path%x}" shift # $1 …
11 bash  parameter 


3
ฉันจะแยกตัวแปร $ 0 เพื่อค้นหาไดเรกทอรีและเส้นทางสัมพัทธ์เป็น bash ได้อย่างไร
ตัวแปร $ 0 มีข้อมูลเส้นทางของสคริปต์ ฉันจะเปลี่ยนข้อมูลเส้นทางเป็นเส้นทางที่แน่นอนได้อย่างไร ฉันหมายถึงวิธีการดำเนินการ ~,., .. หรือคล้ายกัน? ฉันจะแบ่งข้อมูลพา ธ เป็นไดเรกทอรีและชื่อไฟล์ได้อย่างไร ฉันสามารถใช้ python / perl สำหรับสิ่งนี้ได้ แต่ฉันต้องการใช้ bash ถ้าเป็นไปได้
10 bash  parameter 

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
เป็นไปได้ไหมที่จะใช้ตัวแปรพารามิเตอร์เชลล์ ($ 1, …, $ @) โดยตรงใน CLI
บางครั้งมีความจำเป็นต้องจำลองและตรวจสอบตัวแปรข้างต้นในตัวอย่างเล็ก ๆ จากนั้นสามารถคัดลอกไปยังสคริปต์บางรายการได้ทันที ฉันพยายามที่จะแก้ปัญหาโดยใช้ตัวอย่างง่ายๆด้วยวิธีต่อไปนี้: (find $1) /tmp sh -c '(find $1) /tmp' sh -c "find $1" /tmp echo '(find $1) /tmp' | sh และด้วยชุดค่าผสมอื่น ๆ ทดลองโดยการเพิ่มคำสั่งล่าม shebang #!/bin/sh -xแต่ไม่ได้ผลลัพธ์ที่ต้องการ ฉันสามารถทำสิ่งนี้ได้ง่ายๆ

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