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

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

10
ลบคำที่ซ้ำกันทั้งหมดออกจากสตริงโดยใช้เชลล์สคริปต์
ฉันมีสตริงเหมือน "aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc" ฉันต้องการลบคำที่ซ้ำกันออกจากสตริงจากนั้นผลลัพธ์จะเป็นเช่นนั้น "aaa,bbb,ccc" ฉันลองรหัสนี้แหล่งที่มา $ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs มันทำงานได้ดีกับค่าเดียวกัน แต่เมื่อฉันให้ค่าตัวแปรแล้วมันจะแสดงคำที่ซ้ำกันทั้งหมดด้วย ฉันจะลบค่าที่ซ้ำกันได้อย่างไร UPDATE คำถามของฉันคือการเพิ่มค่าที่สอดคล้องกันทั้งหมดลงในสตริงเดียวถ้าผู้ใช้เหมือนกันฉันมีข้อมูลเช่นนี้ -> user name | colour AAA | red AAA | black BBB | red BBB | blue AAA | blue AAA | red …

4
เป็นไปได้หรือไม่ที่จะแก้ไขไฟล์ yml ผ่าน shell script?
นี่คือลักษณะที่นักเทียบท่าของฉัน-compose.yml ดูเหมือน nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' links: - 'anything' ตอนนี้ฉันต้องเพิ่มเนื้อหาผ่านเชลล์สคริปต์ (บนเซิร์ฟเวอร์ ubuntu) ฉันไม่แน่ใจว่ามันจะเป็นไปได้ทั้งหมด: เพิ่มองค์ประกอบใหม่ให้กับnginx/linksหากไม่มีอยู่ ผนวกnewthingบล็อกถ้าไม่มีสิ่งบล็อกใหม่อยู่ เนื้อหาใหม่ควรมีลักษณะเช่นนี้: nginx: container_name: 'nginx' image: 'nginx:1.11' restart: 'always' ports: - '80:80' - '443:443' volumes: - '/opt/nginx/conf.d:/etc/nginx/conf.d:ro' - '/etc/letsencrypt:/etc/letsencrypt' links: - 'anything' - 'newthing' newthing: …

3
วิธีตั้งค่าสคริปต์ให้ทำงานเมื่อพอร์ตได้รับข้อความ
ฉันสงสัยว่าจะได้รับเชลล์สคริปต์เพื่อฟังบนพอร์ตบางอย่าง (อาจใช้ netcat?) หวังว่าเมื่อข้อความถูกส่งไปยังพอร์ตนั้นสคริปต์จะบันทึกข้อความและเรียกใช้ฟังก์ชัน ตัวอย่าง: คอมพิวเตอร์ 1 มีสคริปต์ที่ทำงานในพื้นหลังสคริปต์เปิดพอร์ต 1234 เพื่อรับส่งข้อมูลขาเข้า คอมพิวเตอร์ 2 ส่งข้อความ "hello world" ไปยังพอร์ต 1234 ของคอมพิวเตอร์ 1 สคริปต์บนคอมพิวเตอร์ 1 บันทึกข้อความ "hello world" ไปยังตัวแปร $ MESSAGE สคริปต์เรียกใช้ฟังก์ชันตอนนี้ตัวแปร $ MESSAGE ถูกตั้งค่าแล้ว ฉันจะบริจาคได้อย่างไร

2
มาตรฐาน / แบบแผนอย่างเป็นทางการสำหรับส่วนขยายไฟล์สำหรับเชลล์สคริปต์ไปยังแหล่งที่มา
ฉันสงสัยว่ามีการประชุมสำหรับส่วนขยายประเภทไฟล์สำหรับเชลล์สคริปต์ที่คุณต้องการแหล่งที่มาแทนที่จะเรียกใช้ ตัวอย่างเช่น: ถ้าฉันต้องการเรียกใช้สคริปต์นี้ใน subshell ./script.sh ถ้าฉันต้องการจำรันสคริปต์นี้จากเปลือกปัจจุบัน . script.source มีแบบแผน (เช่น POSIX เป็นต้น) สำหรับประเภทไฟล์ในตัวอย่างที่สองหรือไม่? สิ่งที่ต้องการ.sourceหรือ.sourceme? ปรับปรุง คำถามนี้ไม่ได้ถามเกี่ยวกับความคิดเห็นใด ๆ ฉันระบุชัดเจนว่าฉันต้องการทราบว่ามีนามสกุลไฟล์มาตรฐานสำหรับสคริปต์ประเภทนี้หรือไม่ คำถามนี้ใช้ความคิดเห็นน้อยกว่าคำถามที่ได้รับการตอบรับดีในประเด็นที่คล้ายกัน ( ใช้ส่วนขยาย. sh หรือ. bash สำหรับสคริปต์ทุบตี? )

5
bash + using printf เพื่อพิมพ์ในรูปแบบพิเศษ
ฉันเพิ่งเขียนสคริปต์ทุบตีต่อไปนี้เพื่อตรวจสอบการเข้าถึง ping ในรายการของเครื่อง Linux: for M in $list do ping -q -c 1 "$M" >/dev/null if [[ $? -eq 0 ]] then echo "($C) $MACHINE CONNECTION OK" else echo "($C) $MACHINE CONNECTION FAIL" fi let C=$C+1 done ภาพพิมพ์นี้: (1) linux643 CONNECTION OK (2) linux72 CONNECTION OK (3) linux862 CONNECTION OK …

2
ทดสอบการรองรับอาร์เรย์โดยเชลล์
มีวิธีรัดกุมในการทดสอบเพื่อสนับสนุนอาร์เรย์โดยเชลล์คล้าย Bourne ในบรรทัดคำสั่งหรือไม่ สิ่งนี้เป็นไปได้เสมอ: $ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi หรือการทดสอบ$SHELLและรุ่นเปลือก: $ eval $(echo "$SHELL --version") | grep version จากนั้นอ่าน man page โดยสมมติว่าฉันสามารถเข้าถึงได้ (ถึงตรงนั้น, เขียนจาก/bin/bash, ฉันสมมติว่าเชลล์เหมือนบอร์นทั้งหมดยอมรับตัวเลือกแบบยาว--version, เมื่อแบ่งเช่น ksh เป็นต้น ) ฉันกำลังมองหาการทดสอบอย่างง่ายที่อาจไม่ต้องใส่ข้อมูลและรวมไว้ในส่วนการใช้งานที่จุดเริ่มต้นของสคริปต์หรือแม้กระทั่งก่อนที่จะเรียกมัน

4
Bash รันคำสั่งหลังจากเรียกใช้เชลล์ใหม่
ฉันพยายามสร้างสคริปต์เช่นนี้: #!/bin/bash sudo -s something... เมื่อฉันรันมันฉันจะได้เชลล์ใหม่ แต่somethingจะถูกรันก็ต่อเมื่อฉันออกจากเชลล์ที่สร้างขึ้นโดยsudo -sไม่ได้อยู่ข้างใน ความช่วยเหลือใด ๆ

2
ฉันจะตรวจสอบว่า rsync ทำการเปลี่ยนแปลงในทุบตีได้อย่างไร?
ฉันมีสคริปต์ที่ใช้ rsync เพื่อซิงค์ข้อมูลในรีโมต -> สถานการณ์จำลองในเครื่อง ทันทีหลังจากรันคำสั่ง rsync การตรวจสอบเพื่อดูว่ารหัสข้อผิดพลาดเท่ากับศูนย์หรือไม่ หากเป็นศูนย์จะดำเนินการคำสั่งเพิ่มเติม อย่างไรก็ตามสิ่งนี้ไม่ได้คำนึงถึงข้อเท็จจริงที่ว่า rsync อาจทำงานได้สำเร็จ แต่ไม่ได้ทำการเปลี่ยนแปลงใด ๆ ด้วยเหตุนี้สภาพศูนย์เท่ากับจะทำงานโดยไม่คำนึงถึงซึ่งซ้ำซ้อนเล็กน้อย rsync -aEivm --delete /path/to/remote/ /path/to/local/ if [ $? -eq 0 ]; then # Success do some more work! else # Something went wrong! exit 1; fi สิ่งที่จะเป็นวิธีที่ดีที่สุดในการขยายสิ่งนี้เพื่อตรวจสอบว่ามีการเปลี่ยนแปลงจริง ๆ ตามคำสั่ง rsync ที่รันหรือไม่ ฉันอ่านแล้วว่าแฟล็ก -i สามารถให้เอาต์พุตกับ stdout …

5
ค้นหาไฟล์ใหม่กว่าวันและคัดลอก
ฉันกำลังทำงานกับสคริปต์ที่จะคัดลอกเฉพาะไฟล์ที่สร้างขึ้นภายในวันสุดท้ายไปยังโฟลเดอร์อื่น ปัญหาที่ฉันมีคือสคริปต์ที่ฉันได้คัดลอกไฟล์ทั้งหมดในไดเรกทอรีต้นทางแทนที่จะเป็นไฟล์ที่อายุน้อยกว่าหนึ่งวัน นี่คือสิ่งที่ฉันมี: find . -mtime -1 -exec cp --preserve --parents -a "{}" /somefolder \; รหัสด้านบนคัดลอกไฟล์ทั้งหมดในไดเรกทอรีต้นทาง หากฉันลบข้อโต้แย้งทั้งหมดสำหรับ 'cp' มันจะทำงานได้: find . -mtime -1 -exec cp "{}" /somefolder \; โค้ดด้านบนคัดลอกเฉพาะไฟล์ใหม่ล่าสุดเท่าที่ฉันต้องการ แต่ฉันต้องการรักษาแอตทริบิวต์โดยใช้อาร์กิวเมนต์ cp ฉันได้ลองตัวแปรแล้วและสำหรับการวนรอบคิดว่าตัวเลือก -exec อาจเป็นปัญหา: files="$(find -mtime -1)" for file in "$files" do cp --parents --preserve -a file /somefolder อย่างไรก็ตามผลการวนซ้ำด้านบนในปัญหาเดียวกันไฟล์ทั้งหมดจะถูกคัดลอก หากฉัน …

3
เป็นไปได้ที่จะใช้วงเล็บปีกกา (การเปลี่ยนรูป) และการขยายอาร์เรย์พร้อมกันไหม
{}ไวยากรณ์ส่วนขยายของ Bash อนุญาตให้สร้างวิธีเรียงสับเปลี่ยนได้ง่าย # echo {b,c,d}{a,e,i,o,u} ba be bi bo bu ca ce ci co cu da de di do du อย่างไรก็ตามมันไม่ชัดเจนสำหรับฉันถ้า / เป็นไปได้ที่จะใช้สิ่งนี้พร้อมกับอาร์เรย์ยกเว้นในการใช้งานที่น่าอึดอัดใจมาก$() echoและeval มีวิธีง่ายๆในการใช้อาร์เรย์ที่มีการขยายหยิก (เปลี่ยนรูป)? เพื่อประโยชน์เช่นลองจินตนาการถึงสิ่งที่ชอบ (ซึ่งไม่ได้ผลแน่นอน): CONS=( b c d ) VOWEL=( a e i o u ) echo {${CONS[@]}}{${VOWEL[@]}}

5
แทนที่สตริงหลังจากจุดสุดท้ายในทุบตี
ฉันมีรูปแบบต่อไปนี้ในสตริง (ที่อยู่ IP): 123.444.888.235 ฉันต้องการแทนที่หมายเลขสุดท้ายหลังจากจุดด้วย0ดังนั้นมันจะกลายเป็น: 123.444.888.0 ฉันจะทำในbashภาษาสคริปต์ภาษาอื่นได้อย่างไร

2
เรียกใช้คำสั่งแบบขนานและรอให้กลุ่มคำสั่งกลุ่มหนึ่งเสร็จสิ้นก่อนเริ่มถัดไป
ฉันมีสคริปต์รวมถึงหลายคำสั่ง ฉันจะจัดกลุ่มคำสั่งให้ทำงานร่วมกันได้อย่างไร (ฉันต้องการสร้างกลุ่มคำสั่งหลายกลุ่มภายในแต่ละกลุ่มคำสั่งควรทำงานแบบขนาน (ในเวลาเดียวกัน) กลุ่มควรทำงานต่อเนื่องกันโดยรอกลุ่มหนึ่งให้เสร็จก่อนเริ่ม กลุ่มถัดไป) ... เช่น #!/bin/bash command #1 command #2 command #3 command #4 command #5 command #6 command #7 command #8 command #9 command #10 ฉันจะรันคำสั่งทุก ๆ 3 คำสั่งเพื่อ gether ได้อย่างไร? ฉันเหนื่อย: #!/bin/bash { command #1 command #2 command #3 } & { command #4 command …

3
ออกจากฟังก์ชัน bash ไม่ใช่เทอร์มินัล
ฉันมีสคริปต์ทุบตีด้านล่างซึ่งติดตั้ง Zookeeper แต่ถ้าไม่ได้ติดตั้งแล้ว ##zookeper installZook(){ ZOOK_VERSION="3.4.5" ZOOK_TOOL="zookeeper-${ZOOK_VERSION}" ZOOK_DOWNLOAD_URL="http://www.us.apache.org/dist/zookeeper/${ZOOK_TOOL}/${ZOOK_TOOL}.tar.gz" if [ -e $DEFAULT_INSTALLATION_DEST/${ZOOK_TOOL} ]; then echo "${ZOOK_TOOL} alreay installed"; exit 1; # <<<< here elif [ ! -e $DEFAULT_SOURCE_ROOT/${ZOOK_TOOL}.tar.gz ]; then wgetIt $ZOOK_DOWNLOAD_URL else echo "[info] : $DEFAULT_SOURCE_ROOT/$ZOOK_TOOL already exists" fi sudo mkdir -p /var/lib/zookeeper sudo mkdir -p /var/log/zookeeper tarIt "$DEFAULT_SOURCE_ROOT/$ZOOK_TOOL.tar.gz" …

2
กำหนดแป้นพิมพ์ลัดเพื่อเรียกใช้สคริปต์
ฉันเขียนสคริปต์เพื่อเปลี่ยนความสว่างของหน้าจอของฉัน มีประโยชน์เมื่อฉันทำงานกับโหมดข้อความและแป้นพิมพ์ลัดของแป้นพิมพ์เพื่อเปลี่ยนความสว่างไม่ทำงาน มันเป็นไปได้ที่จะเรียกใช้สคริปต์นี้เพียงแค่กดปุ่มบางอย่างบนแป้นพิมพ์เป็นทางลัดเช่นCtrl+ Alt+ F7?

8
ข้อผิดพลาดกรณีขึ้นอยู่กับเงื่อนไขถ้า
ฉันกำลังมองหาวิธีที่จะมีข้อผิดพลาดเกิดขึ้นตามเงื่อนไข if ภายในเงื่อนไข case ใน bash ตัวอย่างเช่น: input="foo" VAR="1" case $input in foo) if [ $VAR = "1" ]; then # perform fallthrough else # do not perform fallthrough fi ;; *) echo "fallthrough worked!" ;; esac ในรหัสข้างต้นหากตัวแปรVARคือ1ฉันต้องการให้เงื่อนไขกรณีดำเนินการผิดพลาด

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