วิธีใช้ตัวแปร plus glob ($ var *) ใน bash


2

ฉันมีปัญหากับสคริปต์

นี่คือรหัส

#!/bin/bash

date=`date +"%m-%d-%y"`

dokuwiki="dokuwiki.$date*.toolbox.admin.tar.gz"

if test -e  $dokuwiki
then
echo "works"
else
echo "shits broken yo"
fi

ปัญหาของฉันฉันคิดว่าไม่พบไฟล์ที่แปลก

ไฟล์เป็นดังนี้:

dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz

ไชโย


1
มีไฟล์จำนวนเท่าใดที่ตรงกับรูปแบบไวด์การ์ด
choroba

คุณรันสคริปต์จากไดเรกทอรีที่ไฟล์นั้นอยู่หรือไม่?
choroba

ประมาณ 5 ไฟล์และใช่ ถ้าฉันทำมันด้วย grep ฉันสามารถหาไฟล์ได้ แต่ฉันไม่ต้องการที่จะทำมันด้วย grep
tamani

คำตอบ:


1

เครื่องหมายคำพูดป้องกัน * จากการดำเนินการ glob เพื่อให้ตรงกับไฟล์ หากมีไฟล์เดียวเท่านั้นที่จะแก้ไขแล้วเพียงลบเครื่องหมายคำพูด; มิฉะนั้นคุณจะต้องแก้ไขสคริปต์เพื่อจัดการหลายชื่อไฟล์ในส่วนขยายเช่น

for filename in $dokuwiki; do
    # do something with $filename
done

คุณทดสอบแล้วหรือยัง การ*ขยายในการทดสอบที่ไม่มีคำพูด ในการมอบหมายคำพูดไม่สำคัญ
choroba

เมื่อไม่พบไฟล์ใด ๆ คุณจะประมวลผลชื่อไฟล์ด้วย * คุณสามารถวนลูปด้วยls ${dokuwiki} 2>/dev/null | while read filename; do ...
วอลเตอร์ A

1

ปัญหาคือการ*ขยายตัวดาว ( ) จะทำโดยทุบตี

ด้วยไฟล์ doku * หนึ่งไฟล์

mybox $ touch dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz
mybox $ date=`date +"%m-%d-%y"`
mybox $ echo $date
09-12-14
mybox $ dokuwiki="dokuwiki.$date*.toolbox.admin.tar.gz"
mybox $ echo $dokuwiki
dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz
mybox $ test -e $dokuwiki ; echo $?
0

ด้วยสองไฟล์ docu *

mybox $ touch dokuwiki.09-12-14-05-00.toolbox.admin.tar.gz
mybox $ test -e $dokuwiki ; echo $?
-bash: test: dokuwiki.09-12-14-06-00.toolbox.admin.tar.gz: binary operator expected
2

เส้นขยายออกเป็นtest -e doku* test -e doku-1 doku2

คุณอาจต้องการใช้

if ls $dokuwiki > /dev/null  2>&1 
then
   ...

เป็นส่วนทดสอบ


คุณสามารถเขียน testpart เป็นหรือif [ -n "$(ls $dokuwiki 2>/dev/null)" ] if [ $(ls $dokuwiki 2>/dev/null | wc -l) -gt 0 ]
วอลเตอร์ A

@WalterA โซลูชันของคุณใช้ได้ แต่lsจะให้รหัสส่งคืนที่สามารถใช้งานifได้ TI ชี้แจงฉันแก้ไขคำตอบของฉัน
Archemar

-1

หากคุณใช้สิ่งที่มีอยู่ในถ้าเป็นเช่นนี้

if [ -e $docuwiki ]
then
    echo "works"
else
    echo "broken"
fi

มันจะทำงาน ตามที่ระบุไว้ด้านล่างคำสั่ง if เทียบเท่า หลังจาก recopied จากคำถามที่ฉันคิดว่าจริง ๆ แล้วเป็นปัญหากับตัวแปร docuwiki ที่ฉันไม่สามารถสะท้อนได้อย่างถูกต้องเขียนด้วยมือช่วย


2
ทดสอบ -e foo และ [-e foo] เทียบเท่ากัน
Archemar

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