คำถามติดแท็ก shell-script

คำถามเกี่ยวกับเชลล์สคริปต์ไฟล์เรียกทำงานที่ตีความโดยเชลล์ (bash, zsh ฯลฯ )

1
“ set -” ทำอะไรในจุดเข้า Dockerfile นี้?
ฉันพยายามเข้าใจว่าจุดเข้าใช้งานนักเทียบท่านี้ทำอะไร ดูเหมือนว่าสำหรับฉันแล้วมันเป็นรูปแบบที่ธรรมดามากเมื่อเขียน Dockerfiles แต่ทักษะการทุบตีของฉันนั้นมี จำกัด นอกจากนี้มันยากที่ google สำหรับ "-", "$!" ฯลฯ สิ่งเหล่านี้เรียกว่าอะไรในโลกทุบตี? เพื่อสรุปสิ่งที่บรรทัดร้องพยายามทำคืออะไร? if [ "${1#-}" != "$1" ]; then set -- haproxy "$@" fi
41 shell-script  set 

4
cd ลงในไดเร็กทอรีทั้งหมดรันคำสั่งบนไฟล์ในไดเร็กทอรีนั้นและกลับไปยังไดเร็กทอรีปัจจุบันก่อนหน้า
ฉันกำลังพยายามเขียนสคริปต์ที่จะทำงานในไดเรกทอรีที่กำหนดพร้อมกับไดเรกทอรีย่อยระดับเดียวหลายรายการ สคริปต์จะ cd ลงในแต่ละไดเรกทอรีย่อยดำเนินการคำสั่งในไฟล์ในไดเรกทอรีและ cd out เพื่อดำเนินการต่อไปยังไดเรกทอรีถัดไป วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร?

5
แทนที่ตัวแปรสภาพแวดล้อมในไฟล์ด้วยค่าจริงหรือไม่?
มีวิธีง่าย ๆ ในการทดแทน / ประเมินตัวแปรสภาพแวดล้อมในไฟล์หรือไม่? อย่างสมมติว่าฉันมีไฟล์config.xmlที่มี: <property> <name>instanceId</name> <value>$INSTANCE_ID</value> </property> <property> <name>rootPath</name> <value>/services/$SERVICE_NAME</value> </property> ... ฯลฯ ฉันต้องการแทนที่$INSTANCE_IDในไฟล์ด้วยค่าของINSTANCE_IDตัวแปรสภาพแวดล้อม$SERVICE_NAMEด้วยค่าของSERVICE_NAMEenv var ฉันไม่ทราบว่าจะต้องใช้ vars รุ่นใด (หรือมากกว่านั้นฉันไม่ต้องการอัปเดตสคริปต์หากมีคนเพิ่มตัวแปรสภาพแวดล้อมใหม่ลงในไฟล์ปรับแต่ง) ขอบคุณ!

2
ดำเนินการทุบตีสคริปต์ในการเข้าสู่ไดเรกทอรี
เป็นวิธีที่ดีที่สุดในการรันสคริปต์เมื่อเข้าสู่ไดเรกทอรีอะไร เมื่อฉันย้ายไปยังไดเรกทอรีใหม่ฉันต้องการทุบตีเพื่อเรียกใช้สคริปต์ projectSettings.bash เหมือนที่ RVM ทำ

3
ทดสอบว่าสตริงมีสตริงย่อยหรือไม่
ฉันมีรหัส file="JetConst_reco_allconst_4j2t.png" if [[ $file == *_gen_* ]]; then echo "True" else echo "False" fi ฉันทดสอบว่าfileมี "gen" หรือไม่ ผลลัพธ์คือ "เท็จ" ดี! ปัญหาคือเมื่อฉันแทนที่ "gen" ด้วยตัวแปรtestseq: file="JetConst_reco_allconst_4j2t.png" testseq="gen" if [[ $file == *_$testseq_* ]]; then echo "True" else echo "False" fi ตอนนี้เอาต์พุตคือ "True" มันจะเป็นอย่างไร จะแก้ไขปัญหาได้อย่างไร

4
คำสั่ง nvm ไม่พร้อมใช้งานในสคริปต์ทุบตี
ฉันพยายามสร้างสคริปต์ที่nvmและในที่สุดโหนดจะได้รับการติดตั้ง ฉันติดตั้งnvmด้วย cURL แล้ว ฉันเห็นการแก้ไขใน.profileหรือ.bashrcไฟล์ (ทั้งทำงาน) และเมื่อพิมพ์nvmที่พรอมต์ bash มันจะแสดงตัวเลือกที่ใช้ได้ ฯลฯ ดังนั้น nvm ทำงาน ฉันสามารถติดตั้งโหนดด้วยตนเอง แต่ทันทีที่ฉันใส่nvmคำสั่งลงในเชลล์สคริปต์: nano test.sh #!/bin/bash nvm และเรียกใช้ด้วย: chmod 755 test.sh ./test.sh ฉันเข้าใจ: ./test.sh: line 2: nvm: command not found หากไม่สามารถหาได้nvmฉันก็ไม่ต้องคิด nvm ls-remote หรือ nvm install ... ฉันติดตั้ง Ubuntu 14.04 และทุบตีเป็นเปลือกของฉัน

2
การรวมอาร์กิวเมนต์ bash เข้ากับสตริงเดี่ยวด้วยช่องว่าง
ฉันพยายามที่จะเข้าร่วมการขัดแย้งทั้งหมดเพื่อฟังก์ชั่น Bash เป็นหนึ่งสายเดียวที่มีช่องว่างแยกแต่ละอาร์กิวเมนต์ ฉันต้องมีสตริงที่มีคำพูดเดียวรอบสตริงทั้งหมด นี่คือสิ่งที่ฉันมี ... $array=("$@") str="\'" for arg in "${array[@]}"; do let $str=$str+$arg+" " done let $str=$str+"\'" เห็นได้ชัดว่านี่ใช้งานไม่ได้ แต่ฉันสงสัยว่ามีวิธีที่จะบรรลุเป้าหมายนี้หรือไม่?

2
awk '! a [$ 0] ++' ทำงานอย่างไร
หนึ่งซับนี้จะลบบรรทัดที่ซ้ำกันออกจากการป้อนข้อความโดยไม่ต้องเรียงลำดับล่วงหน้า ตัวอย่างเช่น: $ cat >f q w e w r $ awk '!a[$0]++' <f q w e r $ รหัสเดิมที่ฉันพบใน internets อ่านได้: awk '!_[$0]++' นี่เป็นสิ่งที่ทำให้ฉันงุนงงมากขึ้นเมื่อฉัน_มีความหมายพิเศษใน awk เช่นใน Perl แต่กลายเป็นชื่อของอาร์เรย์ ตอนนี้ฉันเข้าใจตรรกะเบื้องหลังหนึ่งซับ: แต่ละบรรทัดอินพุตถูกใช้เป็นคีย์ในอาร์เรย์แฮชดังนั้นเมื่อเสร็จสมบูรณ์แฮชจะมีบรรทัดที่ไม่ซ้ำกันตามลำดับการมาถึง สิ่งที่ฉันต้องการเรียนรู้คือสัญกรณ์นี้ตีความโดย awk ได้อย่างไร เช่นความหมายของสัญญาณบาง ( !) และองค์ประกอบอื่น ๆ ของข้อมูลโค้ดนี้ มันทำงานยังไง?

1
GNU parallel vs & (ฉันหมายถึงพื้นหลัง) vs xargs -P
ฉันสับสนเกี่ยวกับความแตกต่างหรือข้อได้เปรียบ (ถ้ามี) ของการใช้งานชุดหนึ่งใน.shสคริปต์โดยใช้GNU parallel คำตอบของEg Ole Tange : parallel ./pngout -s0 {} R{} ::: *.png &แทนที่จะพูดบ่วงผ่านพวกเขาวางไว้ในพื้นหลัง คำตอบของFrostschutzเช่น: #copied from the link for illustration for stuff in things do ( something with stuff ) & done wait # for all the something with stuff ในระยะสั้นพวกเขามีเพียง syntactically หรือจริงแตกต่างกันอย่างไร และถ้าแตกต่างกันจริงเมื่อฉันควรใช้แต่ละ

3
คำสั่งมาตรฐานใดที่มีอยู่ในการแจกจ่ายบน Linux ทุกครั้ง
ฉันต้องการที่จะรู้ว่าคำสั่งมาตรฐานที่มีอยู่ในทุกระบบ Linux ตัวอย่างเช่นถ้าคุณได้รับ debian / ubuntu / redhat / suse / arch / slackware เป็นต้นคุณจะพบคำสั่งที่นั่นเสมอ: cd, mkdir, ls, echo, grep, sed, awk, ping เป็นต้น ฉันรู้ว่าคำสั่งที่กล่าวถึงบางคำเป็น shell-builtin แต่คำสั่งอื่น ๆ ไม่ได้ แต่พวกเขายังคงอยู่ที่นั่นเสมอ (ตามความรู้และประสบการณ์ของฉัน) ในทางกลับกันคำสั่งเช่น gawk, แยก, traceroute และคำสั่งที่โด่งดังอื่น ๆ จะไม่ถูกติดตั้งโดยค่าเริ่มต้นในการแจกแจงลินุกซ์ที่แตกต่างกัน ฉันค้นหาเว็บต่าง ๆ แต่ฉันไม่พบคำตอบตรงๆ จุดประสงค์คือฉันต้องการสร้างเชลล์สคริปต์และควรทำการตรวจสอบสติบางอย่างหากคำสั่งที่ใช้ในสคริปต์นั้นมีอยู่ในระบบ หากไม่เป็นเช่นนั้นควรแจ้งให้ผู้ใช้ติดตั้งไบนารีที่จำเป็น

2
เหตุใดการใช้ && 75 ครั้งเร็วกว่าถ้า ... fi และวิธีทำให้โค้ดชัดเจนขึ้น
ฉันมีรหัสการทำงานต่อไปนี้: largest_prime=1 for number_under_test in {1..100} do is_prime=true factors='' for ((divider = 2; divider < number_under_test-1; divider++)); do remainder=$(($number_under_test % $divider)) [ $remainder == 0 ] && [ is_prime ] && is_prime=false && factors+=$divider' ' done [ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is …

5
แทนที่บรรทัดใหม่ทั้งหมดเป็นช่องว่างยกเว้นบรรทัดสุดท้าย
ฉันจะแทนที่บรรทัดใหม่ทั้งหมดด้วยช่องว่างได้อย่างไรยกเว้นขึ้นบรรทัดใหม่ล่าสุด ฉันสามารถแทนที่บรรทัดใหม่ทั้งหมดเป็นที่ว่างโดยใช้trแต่ฉันจะทำอย่างไรกับข้อยกเว้นบางอย่าง?

2
“ $ {- # * i}”! =“ $ -” หมายถึงอะไร
ใน/etc/profileฉันเห็นสิ่งนี้: for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done อะไร${-#*i}หมายถึง ${-ฉันไม่สามารถหาคำนิยามของการขยายตัวพารามิเตอร์เริ่มต้น

4
วิธีที่ง่ายที่สุดในการคอมเมนต์ / uncomment บางบรรทัดโดยใช้บรรทัดคำสั่ง
มีวิธีการแสดงความคิดเห็น / uncomment สคริปต์ shell / config / ruby ​​โดยใช้บรรทัดคำสั่งหรือไม่ ตัวอย่างเช่น: $ comment 14-18 bla.conf $ uncomment 14-18 bla.conf นี้จะเพิ่มหรือลบ#ป้ายbla.confบนเส้นไป14 18ปกติฉันจะใช้sedแต่ฉันต้องรู้เนื้อหาของบรรทัดเหล่านั้นแล้วทำการค้นหาแทนที่และนั่นจะให้ผลลัพธ์ที่ผิดเมื่อมีเข็มมากกว่าหนึ่งเข็ม (และเราต้องการแทนที่ N-th เท่านั้น หนึ่ง).

3
chmod + โหมดเงียบ + วิธีบังคับให้ออกรหัส 0 แม้มีข้อผิดพลาด
มันเป็นไปได้รัน chmod และละเว้นข้อผิดพลาดจากคำสั่ง ตัวอย่าง (หมายเหตุ file.txt ไม่แสดงเพื่อแสดงตัวอย่าง) เมื่อฉันพิมพ์ chmod 777 file.txt ฉันได้รับข้อผิดพลาดในผลลัพธ์ chmod: cannot access file.txt : no such file or directory ดังนั้นฉันจึงเพิ่มแฟล็ก -f ลงในคำสั่งดังต่อไปนี้: (file.txt ไม่มีอยู่เพื่อแสดงเคส) chmod -f 777 file.txt echo $? 1 แต่จากตัวอย่าง chmod ส่งคืน 1 โปรดแนะนำวิธีการบังคับให้คำสั่ง chmod ให้รหัสทางออก 0 ทั้งๆที่มีข้อผิดพลาด

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