การเปรียบเทียบสตริงใน bash [[: ไม่พบ


165

ฉันพยายามเปรียบเทียบสตริงในทุบตี ฉันได้พบคำตอบเกี่ยวกับวิธีการที่จะทำมันในStackOverflow ในสคริปต์ที่ฉันพยายามฉันใช้รหัสที่ส่งโดย Adam ในคำถามที่กล่าวถึง:

#!/bin/bash
string='My string';

if [[ "$string" == *My* ]]
then
  echo "It's there!";
fi

needle='y s'
if [[ "$string" == *"$needle"* ]]; then
  echo "haystack '$string' contains needle '$needle'"
fi

ฉันได้ลองวิธีการจากubuntuforumsที่คุณสามารถหาได้ในโพสต์ที่ 2

if [[ $var =~ regexp ]]; then
  #do something
fi

ในทั้งสองกรณีฉันได้รับข้อผิดพลาด:

[[: not found

ผมทำอะไรผิดหรือเปล่า?


ฉันอาจทำผิด แต่การใช้ตัวยึดแบบสี่เหลี่ยมจัตุรัสเพียงอันเดียวนั้นเหมาะกับฉันเสมอ
Markus Unterwaditzer

1
อะไร/bin/bash --versionพิมพ์?
themel

4
[จะไม่ทำงานในกรณีนี้เนื่องจากไม่รองรับรูปแบบ
Ansgar Wiechers

คำตอบ:


157

[[เป็นทุบตีสร้างขึ้น คุณ/bin/bashดูเหมือนจะไม่ใช่คนทุบตีจริงๆ

จากความคิดเห็น:

เพิ่ม#!/bin/bashที่ด้านบนของไฟล์


ถ้าฉันพิมพ์: พิมพ์ '[[' ฉันได้รับ [[เป็นคีย์เวิร์ดเชลล์
user1581900

5
คุณได้รับผลลัพธ์เดียวกันเมื่อคุณเล่น/bin/bash -c "type [["หรือไม่?
Ansgar Wiechers

43
สิ่งนี้เกิดขึ้นกับฉันเพราะฉันลืมที่จะเพิ่ม#!/bin/bashที่ด้านบนของไฟล์ของฉัน
morphatic

12
เกิดขึ้นกับฉันเพราะฉันวิ่งสคริปต์ด้วยshจำนวนมากสำหรับความยุ่งยาก ตอนนี้ฉันต้องทำซ้ำทุกสิ่งที่ฉันแก้ก่อนที่จะค้นหาคำตอบนี้
Louis Loudog Trottier

174

คุณใช้สคริปต์อย่างไร? ถ้าคุณทำกับ

$ sh myscript

คุณควรลอง:

$ bash myscript

หรือถ้าสคริปต์นั้นทำงานได้:

$ ./myscript

ดวลจุดโทษและทุบตีสองเปลือกหอยที่แตกต่างกัน ในกรณีแรกที่คุณส่งสคริปต์ของคุณเป็นอาร์กิวเมนต์ไปยังล่าม sh ในกรณีที่สองคุณตัดสินใจเลือกบรรทัดแรกที่จะใช้ล่าม


ฉันได้รับอนุญาตปฏิเสธวิธีนี้ ด้วย sudo ./myscript ไม่พบคำสั่ง
user1581900

11
ทำchmod + x myscriptจากนั้นเรียกใช้อีกครั้งคุณไม่จำเป็นต้องใช้ sudo
Akos K

2
คุณเรียกใช้สคริปต์อย่างไร
Akos K

เหมือนที่คุณพูด ปกติฉันจะเรียกมันด้วย '$ sh myscipt.sh' ครั้งที่ 2 หลังจากทำ chmod + x myscript.sh ฉันเรียกมันด้วย. /myscript.sh
user1581900

5
คาดว่าจะเกิดข้อผิดพลาดเมื่อคุณเรียกใช้สคริปต์ผ่านsh myscript.shเนื่องจาก/bin/shจำลองเชลล์เป้าหมายในกรณีที่[[ไม่ใช่บิลด์ในตัว อย่างไรก็ตามการเรียกใช้สคริปต์ผ่าน./script.shไม่ควรผลผลิตข้อผิดพลาดเพราะในกรณีที่ shebang ควรทำให้เกิดการ/bin/bashที่จะใช้
Ansgar Wiechers

81

เป็นบรรทัดแรกในสคริปต์ของคุณ:

#!/bin/bash

หรือ

#!/bin/sh

เปลือก sh สร้างข้อความผิดพลาดนี้ไม่ทุบตี


1
บรรทัดแรกก็หายไปเช่นกันสำหรับฉันที่ผลิตข้อผิดพลาดที่ผู้เขียนกล่าวถึง!
ไม่เปิดเผยตัว

14

ฉันมีปัญหานี้เมื่อติดตั้งHeroku Toolbelt

นี่คือวิธีที่ฉันแก้ปัญหา

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 ago 15  2012 /bin/sh -> dash

อย่างที่คุณเห็น / bin / sh เป็นลิงค์ไปยัง "เส้นประ" (ไม่ใช่ทุบตี) และ[[bash syngactic sugarness ดังนั้นฉันเพิ่งแทนที่ลิงค์ไปยัง / bin / bash ระวังใช้ rm แบบนี้ในระบบของคุณ!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
การแทนที่ค่าเริ่มต้นshสำหรับ distro ของคุณนั้น IMHO ไม่ควรทำ เชลล์ที่รันด้วยshควรทำงานด้วยdash; หากไม่เป็นเช่นนั้นนั่นเป็นข้อบกพร่องในสคริปต์ หากคุณต้องการbashคุณสมบัติการใช้งานไม่ได้bash sh
tripleee

4
นี่ฟังดูแย่มาก
MrVaykadji

2
ฉันเห็นด้วยมันเป็นเพียงวิธีแก้ปัญหาที่น่าเกลียด วิธีแก้ปัญหาที่คล้ายกัน แต่ดีกว่าคือการใช้update-alternatives(ใน debian-based-linux) เช่นjustinconover.wordpress.com/2012/05/14/…แต่ในที่สุดมันก็จะเหมือนกัน
jperelli

13

ดังที่ @ Ansgar กล่าวถึง[[นั้นเป็นการทุบตีคือสร้างขึ้นใน Bash และไม่สามารถใช้งานได้สำหรับกระสุนอื่น ๆ [หากคุณต้องการสคริปต์ของคุณจะเป็นแบบพกพาใช้งาน เปรียบเทียบยังจะต้องมีไวยากรณ์ที่แตกต่างกัน: การเปลี่ยนแปลงไป===


ตรวจสอบเล็กน้อยกับ Ubuntu 16.04 และ (sh ->) 0.5.8-2.1ubuntu2 และพบว่า [ทำงานได้ดีเมื่อรวมกับ "-eq" และ alikes ข้อมูลที่คล้ายกันเกี่ยวกับตัวดำเนินการเปรียบเทียบสำหรับบริบทนี้สามารถพบได้ที่นี่: stackoverflow.com/questions/10849297/ … - ฉันเพิ่มเติมกับผู้ประกอบการประเมินผล (()) ตามที่แนะนำในลิงค์ถัดไป แต่ดูเหมือนจะล้มเหลวสำหรับการเปลี่ยนแปลงที่รุกรานน้อยที่สุด หรือ / จะต้องมีการเปลี่ยนแปลงรหัสในระดับที่ลึกกว่ามาก softpanorama.org/Scripting/Shellorama/Control_structures/…
Alexander Stohr

3

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

bash script.sh arg0 ... argn


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