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

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

3
การปฏิบัติที่ดีที่สุดในการแสดงค่าบูลีนในเชลล์สคริปต์คืออะไร
ฉันรู้ว่ามีค่าบูลีนในbashแต่ฉันไม่เคยเห็นพวกเขาใช้ที่ใดก็ได้ ฉันต้องการเขียน wrapper สำหรับข้อมูลบางอย่างที่ค้นหาบนเครื่องของฉันเช่นมีการเสียบ / ติดตั้งไดรฟ์ USB นี้หรือไม่ อะไรคือวิธีปฏิบัติที่ดีที่สุดในการบรรลุเป้าหมาย สตริง? drive_xyz_available=true ตัวเลข (0 สำหรับจริง, ≠ 0 สำหรับเท็จ)? drive_xyz_available=0 # evaluates to true ฟังก์ชั่น? drive_xyz_available() { if available_magic; then return 0 else return 1 fi } ฉันส่วนใหญ่สงสัยเกี่ยวกับสิ่งที่คาดหวังโดยคนอื่นที่ต้องการใช้เสื้อคลุม พวกเขาจะคาดหวังว่าค่าบูลีนคำสั่งเช่นตัวแปรหรือฟังก์ชั่นที่จะเรียก? จากมุมมองด้านความปลอดภัยฉันคิดว่าตัวเลือกที่สองนั้นปลอดภัยที่สุด แต่ฉันชอบที่จะได้ยินประสบการณ์ของคุณ

3
`1 >> 'และ' 2 >> 'หมายถึงอะไรในสคริปต์ทุบตี?
ฉันมีสคริปต์ทุบตีต่อไปนี้จากสิ่งที่ฉันเข้าใจ >> ใช้เพื่อผนวกเอาท์พุทของคำสั่งไปยังไฟล์ที่มีอยู่แทนที่จะเขียนทับ แต่สิ่งที่ทำในกรณีนี้คืออะไร สคริปต์นี้กำลังเรียกไฟล์ exe บางไฟล์ให้แปลงจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง แต่ละไฟล์มีหลายปีดังนั้นมันจึงวนซ้ำแต่ละไฟล์โดยดูที่ชื่อไฟล์ นอกจากนี้เมื่อฉันเรียกใช้สคริปต์นี้ฉันได้รับ "การเปลี่ยนเส้นทางคลุมเครือ" #!/bin/bash source $HOME/.bashrc jobout=${1} joberr=${2} # Set some paths and prefixes yr_bgn=2000 yr_end=2000 yr=${yr_bgn} pth_data='/mnt/' pth_rst='/mnt/' while [ ${yr} -le ${yr_end} ] do ./executable1 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable2 ${pth_data}file${yr}-${yr}.nc ${yr} ${pth_rst} 1>> ${jobout} 2>> ${joberr} ./executable3 …

1
เริ่มกระบวนการพื้นหลังจากสคริปต์และจัดการเมื่อสคริปต์สิ้นสุด
ฉันต้องการเรียกใช้และกำหนดค่ากระบวนการคล้ายกับ daemon จากสคริปต์ shell ของฉันคือ zsh emulated ภายใต้ Cygwin และ daemon คือSFKซึ่งเป็นเซิร์ฟเวอร์ FTP พื้นฐาน สำหรับสิ่งที่สำคัญที่นี่สคริปต์startserv.shสามารถถูกร่างได้ดังนี้: #!/bin/sh read -s -p "Enter Password: " pw user=testuser share=/fshare cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share" $cmd & หลังจากเรียกใช้สคริปต์สคริปต์startserv.shจะหยุด (จบลง?) โดยไม่แสดงพรอมต์ใด ๆ จากนั้น: CTRL+ Cจบทั้งสคริปต์และกระบวนการทำงานเบื้องหลัง การกดปุ่มEnterสคริปต์จะสิ้นสุดกระบวนการจะยังคงอยู่ในพื้นหลัง อย่างไรก็ตามผมสามารถดูได้ผ่านทางpsและไม่ได้jobsดังนั้นเมื่อฉันต้องการที่จะปิดการที่ผมต้องส่งโหดร้ายkill -9สัญญาณซึ่งเป็นสิ่งที่ผมอยากจะหลีกเลี่ยงในความโปรดปรานของ +CTRLC ทางเลือกอื่น จะเรียกใช้สคริปต์ทั้งหมดในพื้นหลัง 'จะ' แต่คำสั่งไม่สามารถได้รับข้อมูลผู้ใช้ถ้าสคริปต์ทำงานเป็นreadstartserv.sh & โปรดทราบว่าฉันต้องการเซิร์ฟเวอร์ชั่วคราวไม่ใช่ภูตจริง: …

8
นับจำนวนไฟล์ในไดเรกทอรีตามนามสกุล
เพื่อวัตถุประสงค์ในการทดสอบฉันต้องการนับจำนวนไฟล์ภาพที่อยู่ในไดเรกทอรีโดยแยกไฟล์ภาพแต่ละประเภทตามนามสกุลไฟล์ (jpg = "ใช่" เพราะในภายหลังจะมีประโยชน์สำหรับสคริปต์อื่นที่จะเรียกใช้การกระทำ ในแต่ละไฟล์นามสกุล) ฉันสามารถใช้สิ่งต่อไปนี้สำหรับไฟล์ JPEG เท่านั้น jpg="" count=`ls -1 *.jpg 2>/dev/null | wc -l` if [ $count != 0 ] then echo jpg files found: $count ; jpg="yes" fi พิจารณานามสกุลไฟล์ jpg, png, bmp, raw และอื่น ๆ ฉันควรใช้whileวงจรเพื่อทำสิ่งนี้หรือไม่?

5
วิธีแยกวิเคราะห์วันที่ ISO8601 ด้วยคำสั่ง linux date
ฉันพยายามใช้คำสั่ง date เพื่อสร้างการประทับเวลาของไฟล์ที่คำสั่ง date สามารถตีความได้ อย่างไรก็ตามคำสั่ง date ดูเหมือนจะไม่ชอบผลลัพธ์ของตัวเองและฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร กรณีในจุด: sh-4.2$ date Fri Jan 3 14:22:19 PST 2014 sh-4.2$ date +%Y%m%dT%H%M 20140103T1422 sh-4.2$ date -d "20140103T1422" Thu Jan 2 23:22:00 PST 2014 วันที่ดูเหมือนจะตีความสตริงด้วยการชดเชย 15 ชั่วโมง มีวิธีแก้ปัญหาที่รู้จักสำหรับเรื่องนี้หรือไม่? แก้ไข: นี่ไม่ใช่ปัญหาของการแสดงผล: sh-4.2$ date +%s 1388791096 sh-4.2$ date +%Y%m%dT%H%M 20140103T1518 sh-4.2$ date -d 20140103T1518 +%s …


3
เมื่อใดที่จะใช้การเปลี่ยนเส้นทางไปยัง stderr ในเชลล์สคริปต์
ฉันรู้ว่าโปรแกรมอรรถประโยชน์ที่ทำงานได้ดีเช่นข้อความgrep "ปกติ" ไปยัง stdout และข้อความแสดงข้อผิดพลาดไปยัง stderr $ grep '^foo' file1 file2 file1:foo grep: file2: No such file or directory เมื่อฉันเขียนเชลล์สคริปท์ตัวเองฉันมักจะพบว่ามันยากที่จะตัดสินใจว่าเอาต์พุตใดและข้อความใดที่ฉันควรแสดงบน stderr หรือถ้าฉันควรจะใส่ใจ ฉันต้องการทราบเกี่ยวกับแนวปฏิบัติที่ดี: เมื่อใดที่มีการเปลี่ยนเส้นทางข้อความไปยัง stderr ที่ถูกเรียกร้องและสมเหตุสมผลและเมื่อใด "ขึ้นอยู่กับ" แน่นอน แต่คุณมีความเข้าใจที่จะช่วยฉันตัดสินใจเหล่านี้หรือไม่ เพื่อให้คำถามอัตนัยนี้สอดคล้องกับรูปแบบฉันต้องการสนับสนุนคำตอบที่ตอบว่า "ทำไม" และได้รับการแจ้งจากประสบการณ์และหากได้รับการสนับสนุนจากข้อเท็จจริง

4
ชักหรือโต้ตอบ
ฉันจะสร้างสคริปต์ที่จะใช้อินพุตของผู้ใช้ดังนั้นฉันตัดสินใจที่จะใช้แส้ แต่ก็สับสนนิดหน่อยว่าอันไหนที่พกพาได้และจะทำงานใน ubuntu 10.x และสูงกว่าและ CentOs5.x ขึ้นไป ฉันรู้readแต่ฉันต้องการไดอะล็อกเหมือนเครื่องมือดังนั้นถ้าใครรู้ทางเลือกอื่นก็แค่บอกให้ฉันรู้

4
รับความกว้างคอนโซลโดยใช้สคริปต์ทุบตี
ฉันพบปัญหาที่ฉันพยายามเพิ่มขนาดของเทอร์มินัลโดยใช้สคริปต์ โดยปกติแล้วฉันจะใช้คำสั่งtput colsภายในคอนโซล แต่ฉันต้องการที่จะสามารถบรรลุคุณสมบัตินี้โดยใช้สคริปต์อย่างเคร่งครัด ณ ตอนนี้ฉันสามารถตรวจจับคอนโซลการทำงานและรับเส้นทางไฟล์ของมันได้ อย่างไรก็ตามฉันพยายามที่จะใช้ข้อมูลนี้เพื่อให้ได้ความกว้างของคอนโซล ฉันพยายามใช้คำสั่งtputแต่ฉันค่อนข้างใหม่สำหรับ Linux / สคริปต์ดังนั้นจึงไม่รู้จริงๆว่าต้องทำอย่างไร เหตุผลในการทำเช่นนี้คือฉันต้องการที่จะสามารถตั้งค่ารายการcronที่แจ้งคอนโซลของความกว้าง / คอลัมน์ทุกครั้ง นี่คือรหัสของฉัน: tty.sh #!/bin/bash #Get PID of terminal #terminal.txt holds most recent PID of console in use value=$(</home/test/Documents/terminal.txt) #Get tty using the PID from terminal.txt TERMINAL="$(ps h -p $value -o tty)" echo $TERMINAL #Use tty to get …

5
รับความกว้างการแสดงผลของสตริงอักขระ
สิ่งที่ใกล้เคียงที่สุดกับวิธีพกพาเพื่อให้ได้ความกว้างในการแสดงผล (บนเทอร์มินัลอย่างน้อยหนึ่งตัวที่แสดงอักขระในโลแคลปัจจุบันที่มีความกว้างที่ถูกต้อง) ของสตริงอักขระจากสคริปต์เชลล์ ฉันสนใจในความกว้างของตัวละครที่ไม่ได้ควบคุมเป็นหลัก แต่โซลูชั่นที่คำนึงถึงตัวควบคุมบัญชีเช่น backspace, carriage return, tabulation ในแนวนอนก็ยินดีเช่นกัน กล่าวอีกนัยหนึ่งฉันกำลังมองหาshell API รอบwcswidth()ฟังก์ชัน POSIX คำสั่งนั้นควรกลับมา: $ that-command 'unix' # 4 fullwidth characters 8 $ that-command 'Stéphane' # 9 characters, one of which zero-width 8 $ that-command 'もで 諤奯ゞ' # 5 double-width Japanese characters and a space 11 หนึ่งสามารถใช้ksh93's printf '%<n>Ls'ที่คำนึงถึงความกว้างตัวอักษรสำหรับการขยายไปยัง<n>คอลัมน์หรือcolคำสั่ง …

2
การเชื่อมตัวแปรสตริงภายใน a สำหรับลูปในเชลล์ bash [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา #!/bin/bash names= find /home/devuser -name 'BI*' echo $names for name in {names[@]} do echo $name $var = $var$name done echo $var

3
Shell Script - ข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็น `else 'ที่ไม่คาดคิด
ด้วยเชลล์สคริปต์ต่อไปนี้ทำไมฉันถึงได้รับข้อผิดพลาด syntax error near unexpected token `else' เชลล์สคริปต์ echo "please enter username" read user_name echo "please enter password" read -s pass echo ${ORACLE_SID} SID=${ORACLE_SID} if ["${ORACLE_SID}" != 'Test'] then sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF copy from scott/tiger@orcl insert EMP using select * from EMP exit EOF else echo "Cannot copy" …

4
วิธีการทุบตียกเลิกการดำเนินการของสคริปต์ในข้อผิดพลาดทางไวยากรณ์หรือไม่
เพื่อความปลอดภัยฉันต้องการทุบตียกเลิกการทำงานของสคริปต์หากพบข้อผิดพลาดทางไวยากรณ์ ฉันประหลาดใจมากฉันไม่สามารถทำสิ่งนี้ได้ ( set -eไม่เพียงพอ) ตัวอย่าง: #!/bin/bash # Do exit on any error: set -e readonly a=(1 2) # A syntax error is here: if (( "${a[#]}" == 2 )); then echo ok else echo not ok fi echo status $? echo 'Bad: has not aborted execution on syntax error!' …

4
ฟังก์ชั่นการโทรประกาศด้านล่าง
เป็นไปได้ไหมที่จะเรียกฟังก์ชั่นที่ถูกประกาศด้านล่างด้วยการทุบตี? ตัวอย่าง if [ "$input" = "yes" ]; then YES_FUNCTION elif [ "$input" = "no" ]; then NO_FUNCTION else exit 0; fi YES_FUNCTION() { ..... ..... } NO_FUNCTION() { ..... ..... }

2
`ที 'สำหรับคำสั่ง
teeสามารถเปลี่ยนเส้นทางอินพุตมาตรฐาน piped ในการส่งออกมาตรฐานและไฟล์ echo Hello, World! | tee greeting.txt คำสั่งด้านบนจะแสดงคำทักทายบนหน้าจอเทอร์มินัลและบันทึกไว้ในเนื้อหาของgreeting.txtไฟล์สร้างไฟล์หากไม่มีชื่อนั้น นอกจากนี้ยังมีการ-aสลับteeเพื่อผนวกไฟล์ที่มีอยู่แทนการเขียนทับ มีวิธีที่สะดวกในการเปลี่ยนเส้นทางอินพุต piped ไปยังคำสั่งและเอาต์พุตมาตรฐานแทนที่จะเป็นไฟล์หรือไม่? ฉันกำลังพยายามสร้างสคริปต์ตัวตัดbukuเพื่อคัดลอกไปยังตัวเลือกหลัก URL ของบุ๊กมาร์กที่ระบุโดยหมายเลขดัชนี # bukuc: #!/bin/sh url=$(buku -f 1 -p $1 | cut -f 2) # NUMBER : URL echo $url # DISPLAY echo $url | xsel # PRIMARY SELECTION ที่นี่ฉันใช้echo สองครั้งแรกสำหรับการแสดงบน terminal แล้วบันทึกในการเลือกหลัก (คลิปบอร์ด) ฉันจินตนาการถึงบางสิ่งecho …

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