ทำไมถึงได้ [[: ไม่พบเมื่อใช้งานสคริปต์]


15

ฉันพยายามเขียนสคริปต์ที่ต้องตรวจสอบว่ามีไฟล์อยู่หรือไม่ ในคอนโซลฉันเขียน

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

และฉันได้รับ

not mod

แต่เมื่อฉันเขียนสคริปต์เพื่อทำสิ่งเดียวกัน:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

แล้วรันสคริปต์ฉันได้รับสิ่งนี้:

./ex.sh: 2: [[: not found
mod

ฉันบันทึกสคริปต์ในไดเรกทอรีปัจจุบันและตั้งชื่อเป็น ex.sh จากนั้นฉันตรวจสอบให้แน่ใจว่าสามารถเรียกใช้งานได้ ในการเรียกใช้สคริปต์ฉันต้องทำสิ่งนี้:

./ex.sh

ทำไมฉันถึงได้รับปัญหานี้? ฉันลองมาหลายอย่างแล้ว:

if [ -a /home ...

และ

if test -a /home ...

ทั้งสองคนกลับมา

13: -a: unexpected operator

ฉันสามารถทำให้มันใช้งานได้ แต่สำหรับฉันต้องลบบรรทัดแรก (#! / bin / sh) คุณรู้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น?
Buzu

ลอง#!/bin/bash
kev

สวัสดีเคฟฉันก็รู้สึกเช่นนั้นเหมือนกัน ฉันเพิ่งปรับปรุงคำถามของฉัน ฉันใช้เวลากับสิ่งนี้มากเกินไป แต่ฉันดีใจที่ฉันสามารถแก้ไขมันได้ ขอบคุณสำหรับคำตอบ. เป็นวิธีแก้ปัญหาแน่นอน
Buzu

@Kev กรุณาโพสต์ว่าเป็นคำตอบ
slhck

Buzu, @Kev - หากคุณพบคำตอบให้โพสต์เป็นคำตอบด้านล่างอย่าแก้ไขคำถาม
1686

คำตอบ:


10

คุณกำลังเรียกใช้สคริปต์ที่เขียนขึ้นสำหรับทุบตีภายใต้การดวลจุดโทษซึ่งขาดคุณสมบัติต่างๆของไวยากรณ์ขยาย - [[เป็นคำสั่งในตัวและไม่ได้อยู่ในที่มีอยู่bashsh

เปลี่ยน#!/bin/shไปหรือ#!/bin/bash#!/usr/bin/env bash


ในบางระบบ/bin/shเป็น symlink /bin/bashไป และมันอาจจะปลอดภัยพอสมควรที่จะคิดว่าเป็นbash /bin/bash
Keith Thompson

@ Keith: มันเป็น/bin/bashระบบ Linux ส่วนใหญ่ แต่/usr/pkg/bin/bashใน BSDs หรือ/usr/local/bin/bashถ้ารวบรวมจากแหล่งโดยตรง
user1686

@grawity: หรือที่ใดก็ตามที่คุณตัดสินใจที่จะใส่มันถ้าคุณรวบรวมจากแหล่งที่มา ตกลงจุดที่ดี โดยส่วนตัวฉันควรแก้ไข shebang สำหรับแต่ละระบบมากกว่าใช้/usr/bin/envแฮ็ค (ซึ่งใช้สิ่งใดก็ตามที่bashเกิดขึ้นกับผู้โทร$PATHในขณะนี้) แต่เป็น YMMV (และคุณสามารถสร้าง/bin/bashsymlink - หากคุณมีสิทธิ์ของผู้ดูแลระบบและคุณไม่ต้องยุ่งกับเรื่อง/binนี้)
Keith Thompson

@Keith: /usr/localเป็นที่ที่ autotools ตัดสินใจใส่ตามค่าเริ่มต้น ตราบใดที่ "เป็นการส่วนตัว" ฉันต้องการให้เซิร์ฟเวอร์และ VM ต่าง ๆ ดึงออกมาจากที่เก็บสคริปต์ / เครื่องมือเดียวกันและไม่จำเป็นต้องแก้ไข Shebangs ซ้ำอีกครึ่งหนึ่งหลังจากการกระทำทุกครั้ง
user1686

ไม่มีพวกเขาทำงานให้ฉัน: / im บน centos
astroanu

0

ระบุ bash แทน sh เมื่อเรียกใช้สคริปต์ ฉันสังเกตเห็นเป็นการส่วนตัวว่าพวกเขาแตกต่างภายใต้ Ubuntu 12.10:

bash script.sh arg0 ... argn

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