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

สำหรับคำถามเกี่ยวกับสคริปต์ที่เขียนขึ้นสำหรับเชลล์คำสั่ง Bash สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาด / ข้อผิดพลาดทางไวยากรณ์โปรดตรวจสอบด้วยโปรแกรม shellcheck (หรือในเซิร์ฟเวอร์ shellcheck เว็บที่ https://shellcheck.net) ก่อนโพสต์ที่นี่ คำถามเกี่ยวกับการใช้งานอินเทอร์แอคทีฟของ Bash นั้นมีแนวโน้มที่จะอยู่ในหัวข้อของผู้ใช้ขั้นสูงมากกว่าในสแต็คโอเวอร์โฟลว์

20
ลบองค์ประกอบออกจากอาร์เรย์ Bash
ฉันต้องการลบองค์ประกอบออกจากอาร์เรย์ใน bash shell โดยทั่วไปฉันเพียงแค่ทำ: array=("${(@)array:#<element to remove>}") น่าเสียดายที่องค์ประกอบที่ฉันต้องการลบเป็นตัวแปรดังนั้นฉันจึงไม่สามารถใช้คำสั่งก่อนหน้านี้ได้ ตัวอย่างด้านล่าง: array+=(pluto) array+=(pippo) delete=(pluto) array( ${array[@]/$delete} ) -> but clearly doesn't work because of {} ความคิดใด ๆ ?
116 arrays  bash  variables 

19
ฉันจะลบบรรทัดใหม่ออกจากไฟล์ข้อความได้อย่างไร
ฉันมีข้อมูลต่อไปนี้และจำเป็นต้องรวมข้อมูลทั้งหมดไว้ในบรรทัดเดียว ฉันมีสิ่งนี้: 22791 ; 14336 ; 22821 ; 34653 ; 21491 ; 25522 ; 33238 ; ฉันต้องการนี้: 22791;14336;22821;34653;21491;25522;33238; แก้ไข ไม่มีคำสั่งใดทำงานได้อย่างสมบูรณ์ ส่วนใหญ่ให้ข้อมูลมีลักษณะดังนี้ 22791 ;14336 ;22821 ;34653 ;21491 ;25522
116 linux  bash  scripting  shell  sed 

6
ฉันจะเขียนสคริปต์การตอบสนอง“ ใช่” สำหรับการติดตั้งโปรแกรมได้อย่างไร?
ฉันทำงานกับอินสแตนซ์ Amazon Linux และฉันมีสคริปต์สองสามตัวในการเติมข้อมูลและติดตั้งโปรแกรมทั้งหมดที่ฉันทำงานด้วย แต่มีสองโปรแกรมถามว่า: Do you want to continue [Y/n]? และหยุดการติดตั้งชั่วคราว ฉันต้องการตอบ "Y" โดยอัตโนมัติในทุกกรณีตอนนี้ฉันแน่ใจแล้วว่าจะทำอย่างไร
116 linux  bash  scripting 

8
การคูณบนเทอร์มินัลบรรทัดคำสั่ง
ฉันใช้เทอร์มินัลอนุกรมเพื่อป้อนข้อมูลในการทดลองในห้องปฏิบัติการของเรา ฉันพบว่าการใช้ $ echo "5X5" เพียงส่งคืนสตริงของ"5X5". มีคำสั่งในการดำเนินการคูณหรือไม่?
115 bash  unix  command-line 

5
ไม่รวมไดเร็กทอรีย่อยโดยใช้ find
ฉันมีโครงสร้างไดเร็กทอรีแบบนี้ data |___ | abc |____incoming def |____incoming |____processed 123 |___incoming 456 |___incoming |___processed มีโฟลเดอร์ย่อยที่เข้ามาในทุกโฟลเดอร์ภายในไดเรกทอรีข้อมูล ฉันต้องการรับไฟล์ทั้งหมดจากโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมดยกเว้น def / ขาเข้าและ 456 / dirs ที่เข้ามา ฉันลองใช้คำสั่งต่อไปนี้ find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print แต่มันไม่ทำงานตามที่คาดไว้ ราวี
115 bash  unix 

14
รับแค่จำนวนเต็มจาก wc ใน bash
มีวิธีรับจำนวนเต็มที่ wc ส่งคืนเป็น bash หรือไม่? โดยพื้นฐานแล้วฉันต้องการเขียนหมายเลขบรรทัดและจำนวนคำลงในหน้าจอหลังชื่อไฟล์ output: filename linecount wordcount นี่คือสิ่งที่ฉันมีจนถึงตอนนี้: files=`ls` for f in $files; do if [ ! -d $f ] #only print out information about files !directories then # some way of getting the wc integers into shell variables and then printing them echo "$f $lines $ …
115 bash  wc 


16
รับ“ คำเตือน! PATH ไม่ได้ตั้งค่าอย่างถูกต้อง” เมื่อใช้ rvm ใช้ 2.0.0 - ค่าเริ่มต้น
ข้างต้นไม่ทำงานครั้งแรกทำงานครั้งที่ 2 ลองตั้งค่าเวอร์ชัน Ruby เป็น 2.0.0 สำหรับหน้าต่างเชลล์ใหม่ การทำ $ rvm use 2.0.0 --default จะช่วยให้ Warning! PATH is not properly set up, '/home/durrantm/.rvm/gems/ruby-1.9.3-p125/ bin' is not at first place, usually this is caused by shell initialization files - check them for ' PATH=...' entries, it might also help to re-add RVM …

11
วิธีที่ดีที่สุดในการใช้สคริปต์ R บนบรรทัดคำสั่ง (เทอร์มินัล) คืออะไร?
สะดวกมากที่จะมีสคริปต์ R สำหรับสร้างพล็อตอย่างง่ายจากบรรทัดคำสั่ง อย่างไรก็ตามการเรียกใช้ R จากสคริปต์ bash นั้นไม่สะดวกเลย อุดมคติอาจเป็นเช่น #!/path/to/R ... หรือ #!/usr/bin/env R ... แต่ฉันไม่สามารถทำงานอย่างใดอย่างหนึ่งได้ อีกทางเลือกหนึ่งคือการเก็บสคริปต์ไว้ใน R อย่างหมดจดเช่นscript.Rและเรียกใช้โดยมีR --file=script.Rหรือคล้ายกัน อย่างไรก็ตามในบางครั้งสคริปต์จะอาศัยสวิตช์บรรทัดคำสั่งที่คลุมเครือซึ่งจุดใดส่วนหนึ่งของโค้ดอยู่นอกสคริปต์ ตัวอย่าง: ด้อมสิ่งที่เป็น R จากทุบตีผ่าน .Rprofile ท้องถิ่นสวิทช์ที่ต้องการอยู่แล้วทุกอย่างหมายถึงการยกเว้น--vanilla--no-init-file อีกทางเลือกหนึ่งคือสคริปต์ทุบตีเพื่อจัดเก็บแฟล็ก R และเรียกใช้งานได้อย่างไม่ลำบากซึ่งจะเรียกสคริปต์ R ปัญหาคือว่านี่หมายความว่าโปรแกรมเดียวเพิ่งแยกออกเป็นสองไฟล์ซึ่งตอนนี้ต้องซิงค์โอนไปยังเครื่องใหม่ด้วยกัน ฯลฯ ตัวเลือกที่ฉันดูถูกน้อยที่สุดในขณะนี้คือการฝัง R ในสคริปต์ทุบตี: #!/bin/bash ... # usage message to catch bad input without invoking R ... # …
115 bash  r 

6
การส่งผ่านข้อโต้แย้งไปยังโปรแกรมโต้ตอบแบบไม่โต้ตอบ
ฉันมีสคริปต์ทุบตีที่ใช้readคำสั่งเพื่ออ่านอาร์กิวเมนต์ของคำสั่งแบบโต้ตอบตัวอย่างเช่นตัวเลือกใช่ / ไม่ใช่ มีวิธีเรียกสคริปต์นี้ในสคริปต์ที่ไม่ใช่แบบโต้ตอบที่ส่งผ่านค่าตัวเลือกเริ่มต้นเป็นอาร์กิวเมนต์หรือไม่ ไม่ใช่แค่ตัวเลือกเดียวที่ฉันต้องส่งผ่านไปยังสคริปต์โต้ตอบ

5
คัดลอกไฟล์ทั้งหมดที่มีนามสกุลที่แน่นอนจากไดเรกทอรีย่อยทั้งหมด
ภายใต้ unix ฉันต้องการคัดลอกไฟล์ทั้งหมดที่มีนามสกุล (ไฟล์ excel ทั้งหมด) จากไดเรกทอรีย่อยทั้งหมดไปยังไดเร็กทอรีอื่น ฉันมีคำสั่งต่อไปนี้: cp --parents `find -name \*.xls*` /target_directory/ ปัญหาเกี่ยวกับคำสั่งนี้คือ: มันคัดลอกโครงสร้างไดเร็กทอรีด้วยและฉันต้องการไฟล์เท่านั้น (ดังนั้นไฟล์ทั้งหมดควรลงท้ายด้วย / target_directory /) ไม่คัดลอกไฟล์ที่มีช่องว่างในชื่อไฟล์ (ซึ่งค่อนข้างน้อย) วิธีแก้ปัญหาเหล่านี้หรือไม่?
115 bash  unix  cp 

30
วิธีใดเป็นวิธีที่ดีที่สุดในการลบเส้นทางออกจากตัวแปร $ PATH ใน Bash
หรือโดยทั่วไปฉันจะลบรายการออกจากรายการที่คั่นด้วยโคลอนในตัวแปรสภาพแวดล้อม Bash ได้อย่างไร ฉันคิดว่าฉันเคยเห็นวิธีง่ายๆในการทำเมื่อหลายปีก่อนโดยใช้รูปแบบการขยายตัวแปร Bash ขั้นสูง แต่ถ้าเป็นเช่นนั้นฉันก็หลงทาง การค้นหา Google อย่างรวดเร็วพบผลลัพธ์ที่เกี่ยวข้องเพียงไม่กี่รายการและไม่มีสิ่งใดที่ฉันจะเรียกว่า "เรียบง่าย" หรือ "หรูหรา" ตัวอย่างเช่นสองวิธีโดยใช้ sed และ awk ตามลำดับ: PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;') PATH=!(awk -F: '{for(i=1;i<=NF;i++){if(!($i in a)){a[$i];printf s$i;s=":"}}}'<<<$PATH) ไม่มีอะไรตรงไปตรงมา? มีอะไรที่คล้ายคลึงกับฟังก์ชัน split () ใน Bash หรือไม่? ปรับปรุง: ดูเหมือนว่าฉันต้องขอโทษสำหรับคำถามที่คลุมเครือโดยเจตนา ฉันไม่ค่อยสนใจที่จะแก้ปัญหาการใช้งานที่เฉพาะเจาะจงมากกว่าการกระตุ้นให้เกิดการสนทนาที่ดี โชคดีที่ได้มา! มีเทคนิคที่ชาญฉลาดอยู่ที่นี่ ในท้ายที่สุดฉันได้เพิ่มฟังก์ชั่นสามอย่างต่อไปนี้ในกล่องเครื่องมือของฉัน เวทมนตร์เกิดขึ้นใน path_remove ซึ่งส่วนใหญ่มาจากการใช้awkตัวแปร RS อย่างชาญฉลาดของ …

6
คุณต่อท้ายสตริงที่มีอยู่แล้วได้อย่างไร?
ฉันต้องการต่อท้ายสตริงเพื่อให้ทุกครั้งที่วนซ้ำจะเพิ่มพูดว่า "test" ในสตริง เช่นเดียวกับใน PHP คุณจะทำ: $teststr = "test1\n" $teststr .= "test2\n" echo = "$teststr" echos: test1 test2 แต่ฉันต้องทำในเชลล์สคริปต์

8
วิธีการจัดเก็บคำสั่งในตัวแปรในเชลล์สคริปต์
ฉันต้องการเก็บคำสั่งที่จะใช้ในช่วงเวลาต่อมาในตัวแปร (ไม่ใช่ผลลัพธ์ของคำสั่ง แต่เป็นคำสั่งเอง) ฉันมีสคริปต์ง่ายๆดังนี้: command="ls"; echo "Command: $command"; #Output is: Command: ls b=`$command`; echo $b; #Output is: public_html REV test... (command worked successfully) อย่างไรก็ตามเมื่อฉันลองทำอะไรที่ซับซ้อนขึ้นเล็กน้อยมันก็ล้มเหลว ตัวอย่างเช่นถ้าฉันทำ command="ls | grep -c '^'"; ผลลัพธ์คือ: Command: ls | grep -c '^' ls: cannot access |: No such file or directory ls: cannot access grep: …
114 linux  bash  variables  command 


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