2010-03-17 19 views
17

में चर सेट करने में असमर्थ मैं एक शेड्यूल पर ऐप्पलस्क्रिप्ट से चलने वाली बैश स्क्रिप्ट का उपयोग करके हर रात स्वचालित रूप से किसी फ़ोल्डर से चलती फ़ाइलों को स्वचालित रूप से स्वचालित रूप से स्वचालित करने का प्रयास कर रहा हूं। मैं मैक ओएसएक्स पर एक बैश स्क्रिप्ट लिखने का प्रयास कर रहा हूं, और यह असफल रहता है।बैश स्क्रिप्ट

#!/bin/bash 
folder = "ABC" 
useracct = 'test' 
day = date "+%d" 
month = date "+%B" 
year = date "+%Y" 
folderToBeMoved = "https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername = "/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; 
    then rm $folderToBeMoved; 
fi 

अब मेरी पहली समस्या यह है कि मैं सभी को एक चर सेट नहीं कर सकता है: संक्षेप में यह है कि मैं क्या है (मेरे सारे echo रों त्रुटि की जाँच के लिए कर रहे हैं) है। यहां तक ​​कि शाब्दिक भी जहां मैं इसे कुछ शाब्दिक बना देता हूं। मेरे सभी echo एस खाली आ गए हैं। मैं दिन, महीने या साल को पकड़ नहीं सकता, यह भी खाली हो जाता है।

मुझे यह कहते हुए एक त्रुटि मिलती है कि -f नहीं मिला है।

मुझे एक त्रुटि मिलती है कि फ़ाइल का एक अप्रत्याशित अंत है।

मैं फ़ाइल बनाया है और एक chmod u+x scriptname.sh

मुझे यकीन है कि क्यों कुछ भी नहीं सब पर काम कर रहा है नहीं कर रहा हूँ था। मैं ओएसएक्स पर इस बैश स्क्रिप्ट के लिए बहुत नया हूं, और केवल विंडोज़ vbscript के साथ अनुभव है। कोई भी सहायता मददगार होगी, धन्यवाद!

उत्तर

40

बैश लिपियों में असाइनमेंट = के साथ स्पेस नहीं हो सकता है और आप शायद अपनी तिथि आदेशों बैकटिक$() में संलग्न हैं:

#!/bin/bash 
folder="ABC" 
useracct='test' 
day=$(date "+%d") 
month=$(date "+%B") 
year=$(date "+%Y") 
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername="/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; then rm $folderToBeMoved; fi 
, बाहर टिप्पणी की मेरे लिए यह outputs पिछले तीन लाइनों के साथ

:

Network is 
day is 16 
Month is March 
YEAR is 2010 
source is /users/test/Documents/Archive/Primetime.eyetv 
dest is /Volumes/Media/Network/ABC/March162010 
+2

वापस टिक बुराई (गैर घोंसला) हैं। मैं खुद ($) का उपयोग करूंगा। लेकिन एक अच्छे जवाब के लिए +1। – paxdiablo

+0

@paxdiablo मैं बहुत धीरे-धीरे '$()' का उपयोग करना सीख रहा हूं, लेकिन 15 वर्षीय आदत को पुन: प्रोग्राम करना थोड़ा मुश्किल है। – Isaac

+0

@Isaac: यह इतना लायक है। मैंने एक लिंट स्क्रिप्ट लिखी जो समय-समय पर बैकटिक्स के बारे में '~/bin' और yammers को क्रॉल करता है। उन्हें खत्म करो! –

20

पांच समस्याओं:

  1. से पहले या उसके बराबर चिह्न के बाद एक खाली स्थान नहीं छोड़ें।
  2. टेक्स्ट के रूप में कमांड के आउटपुट प्राप्त करने के लिए "$(...)" का उपयोग करें।
  3. [ एक आदेश है। इसे और तर्क के बीच एक जगह रखें।
  4. कमांड केस-संवेदी हैं। आप echo चाहते हैं।
  5. चर के चारों ओर डबल कोट्स का उपयोग करें। rm "$folderToBeMoved"
+1

+1, जो इसे बहुत अधिक कवर करता है। # 4 हालांकि अधिकांश ओएस एक्स सिस्टम के लिए सटीक नहीं है। चूंकि मानक सेटअप में केस-असंवेदनशील फाइल सिस्टम है, इसलिए ईसीएचओ ठीक काम करेगा। मैं अभी भी इसकी अनुशंसा नहीं करता, लेकिन यह इस स्क्रिप्ट के साथ कोई समस्या नहीं पैदा करेगा। –

+0

मैक ओएस एक्स पर डिफ़ॉल्ट फाइल सिस्टम केस-असंवेदनशील है। 'ईसीएचओ 'बस' echo' के साथ ही काम करता है, हालांकि पोर्टेबिलिटी के लिए यह एक बुद्धिमान विचार नहीं है। – dreamlax

+1

पर्याप्त मेला, लेकिन फिर 'ECHO' निष्पादन योग्य निष्पादित करता है, न कि बैश अंतर्निहित। –

3

यहाँ संशोधन स्क्रिप्ट

०१२३५१६४१०६१ है
#!/bin/bash  
folder="ABC" #no spaces between assignment  
useracct='test'  
day=$(date "+%d") # use $() to assign return value of date command to variable  
month=$(date "+%B")  
year=$(date "+%Y")  
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv"  
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"  
ECHO "Network is $network" $network  
ECHO "day is $day"  
ECHO "Month is $month"  
ECHO "YEAR is $year"  
ECHO "source is $folderToBeMoved"  
ECHO "dest is $newfoldername"  

mkdir "$newfoldername"  
cp -R "$folderToBeMoved" "$newfoldername" 
if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- put a space at square brackets and quote your variables. 
rm "$folderToBeMoved"; 
fi 
1

folder = "ABC" की कोशिश करता तर्क = और "ABC" साथ folder नाम के एक आदेश को चलाने के लिए। बैश में आदेश का प्रारूप है:

command arguments separated with space 

काम के साथ किया जाता है, जबकि:

variable=something 

  • [ -f $newfoldername/Primetime.eyetv] में, [ एक आदेश है (test) और -f और $newfoldername/Primetime.eyetv] दो हैं तर्क।यह एक तीसरा तर्क (]) की अपेक्षा करता है जो इसे नहीं मिल सकता है (तर्क अंतरिक्ष से अलग होना चाहिए) और इस प्रकार त्रुटि दिखाई देगी।
  • [-f $newfoldername/Primetime.eyetv] एक कमांड [-f, इस तरह के मामलों के लिए $newfoldername/Primetime.eyetv]

आम तौर पर तर्क के साथ चलाने के shellcheck में अपने कोड पेस्ट और प्रतिक्रिया देखने के लिए कोशिश करता है।

संबंधित मुद्दे