অপ্রত্যাশিত টোকেন near ফাইয়ের কাছে সিনট্যাক্স ত্রুটি `


17

আমি অগত্যা উত্তরটি চাই না তবে যদি কেউ আমাকে কিছু সাহিত্য বা উদাহরণের দিকে নির্দেশ করতে পারে। আমি এটি বের করতে চাই।

আমি স্ক্রিপ্টটি চালানোর সময় আমি একটি ত্রুটি পেয়েছি:

অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি fi

আমি অনুমান করেছি যে আমার ifবিবৃতিটি আমার ifবক্তব্যগুলিতে মন্তব্য করার মাধ্যমে এবং এর echo "$NAME"মধ্যে নামগুলি প্রদর্শন করে যা যুক্ত করে আমার সমস্যাটি রয়েছে /etc/

যখন আমি পরিবর্তন করতে, অপসারণ #থেকে ifএবং fiযোগ #করার জন্য wc -c "$NAME", আমি বাক্যগঠন ত্রুটি আমি উপরে তালিকাভুক্ত পাবেন। আমি যোগ করেছি ;মধ্যে ]তারপর। আমিও thenরেজোলিউশন না করে পরের লাইনে চলে এসেছি ।

#!/bin/bash
for NAME in /etc/*
do

     if [ -r "$NAME" -af "$NAME" ] then
          wc -c "$NAME"
     fi
done

9
যখনই আপনার শেল সিনট্যাক্স ত্রুটি হয়, একটি ভাল প্রথম পদক্ষেপ হ'ল আপনার কোডটি শেলচেক.নেটে কেটে পেস্ট করা এবং এটি চিহ্নিত করা ত্রুটিগুলি সংশোধন করা। যদি এর বার্তা বুঝতে সমস্যা হয় তবে এখানে এসে জিজ্ঞাসা করুন।
1024

2
কী -afকরার কথা?
ilkkachu

আপনাকে সেই সাইটের জন্য ধন্যবাদ @ জন1024 এটি সবচেয়ে দরকারী ছিল, আমি এটি ভবিষ্যতের রেফারেন্সের জন্য বুকমার্ক করেছি।
ক্রিস্টিনা এ গুজম্যান

1
@ খ্রিস্টিনাআগুজ্জামান এই জাতীয় ক্ষেত্রে -aনিরর্থক কারণ শর্তটি ইতিমধ্যে এর মধ্যে অন্তর্ভুক্ত রয়েছে -f। --- যাইহোক এর মধ্যে একাধিক শর্ত [ ](যেমন এই কমান্ডটি উপলভ্য test) যেমন লজিকাল অপারেটরগুলি -a(এবং) বা -o(বা) ব্যবহার করে যোগ দিতে হবে তবে নীচের জবাবটিতে যেমন প্রস্তাবিত হয়েছিল তেমন একাধিক [ ]( test) কমান্ড ব্যবহার করা এবং যোগদান করা ভাল is তাদের ব্যবহার শেল অপারেটার পছন্দ &&বা ||
পাবুক

2
ক্রিস্টিনা, @ জন ১০২৪ অনুসারে উল্লেখ করেছেন, শেলচেক.net খুব স্পষ্টভাবে কিছু বাক্য গঠন বা আরও গভীরতর ভুলগুলি দেখায় (যেমনটি লিঙ্কটি সি কোডের জন্য করে)। আমি অবশ্যই পড়তে হবে: মাইউকি.উইলজ.ইউআর.ইউজিআউট / ব্যাশপিটফ্লসস (কমপক্ষে একবার এটি পড়ুন!) এবং মাইউইকি.উইলজি.আর. / বাশএফএকিউ এবং মাইইউইকি.উইউলজিইআরআরও / ব্যাশগুইডও পড়তে ভাল।
অলিভিয়ার ডুলাক

উত্তর:


46

কীওয়ার্ড মত if, then, else, fi, for, caseএবং তাই প্রয়োজন একটি জায়গা যেখানে শেল কমান্ড নাম আশা করা। অন্যথায় এগুলিকে সাধারণ শব্দ হিসাবে বিবেচনা করা হয়। উদাহরণ স্বরূপ,

echo if

কেবল প্রিন্ট করে if, এটি শর্তসাপেক্ষ নির্দেশনা শুরু করে না।

এইভাবে, লাইনে

if [ -r "$NAME" -af "$NAME" ] then

শব্দটি thenকমান্ডের একটি আর্গুমেন্ট [(যা এটি কখনও চালাতে পারা সম্পর্কে অভিযোগ করবে)। শেলটি thenসন্ধান করে fiএবং কমান্ডের পজিশনের সন্ধান করে। সেখানে যেহেতু একটি ifএখনও তার খুজছে then, fiঅপ্রত্যাশিত, সেখানে একটি বাক্য গঠন ত্রুটি আছে।

আপনাকে আগে একটি কমান্ড টার্মিনেটর রাখা দরকার thenযাতে এটি একটি কীওয়ার্ড হিসাবে স্বীকৃত। সর্বাধিক সাধারণ কমান্ড টার্মিনেটর হ'ল লাইন ব্রেক, তবে এর আগে thenসেমিকোলন ব্যবহার করা সাধারণ (যা লাইন ব্রেকের ঠিক একই অর্থ রয়েছে)।

if [ -r "$NAME" -af "$NAME" ]; then

অথবা

if [ -r "$NAME" -af "$NAME" ]
then

একবার ঠিক করে ফেললে আপনি কমান্ড থেকে অন্য একটি ত্রুটি পাবেন [কারণ এটি বুঝতে পারে না -af। আপনি সম্ভবত বোঝাতে চেয়েছিলেন

if [ -r "$NAME" -a -f "$NAME" ]; then

যদিও পরীক্ষার কমান্ডগুলি বিকল্পগুলির মতো দেখায়, আপনি এগুলি তাদের মতো বান্ডেল করতে পারবেন না। তারা [কমান্ডের অপারেটর এবং তাদের প্রত্যেকের পৃথক শব্দ হওয়া উচিত (যেমন [এবং করাও ])।

যাইহোক, যদিও [ -r "$NAME" -a -f "$NAME" ]কাজ করে, আমি উভয়ই লেখার পরামর্শ দিই

[ -r "$NAME" ] && [ -f "$NAME" ]

অথবা

[[ -r $NAME && -f $NAME ]]

[ … ]কন্ডিশনালগুলি সহজ রাখা সবচেয়ে ভাল কারণ [কমান্ড অপারেটরগুলি অপারেন্ড থেকে সহজেই আলাদা করতে পারে না। যদি $NAMEঅপারেটরের মতো দেখতে লাগে এবং অপারেটরটি বৈধ হয় এমন কোনও অবস্থানে উপস্থিত হয় তবে এটি অপারেটর হিসাবে পার্স করা যেতে পারে। এই উত্তরে দেখা সাধারণ ক্ষেত্রে এটি ঘটবে না, তবে আরও জটিল ক্ষেত্রে ঝুঁকিপূর্ণ হতে পারে। এটিকে পৃথক কল দিয়ে লিখতে [এবং শেলের লজিকাল অপারেটরগুলি ব্যবহার করে এই সমস্যা এড়ানো যায়।

দ্বিতীয় বাক্য [[ … ]]গঠনটি শর্তসাপেক্ষ কন্সট্রাক্ট ব্যবহার করে যা ব্যাশে বিদ্যমান (এবং ksh এবং zsh, তবে প্লেইন sh নয়)। এই কনস্ট্রাক্ট বিশেষ সিনট্যাক্স, যেহেতু হয় [এইভাবে আপনি ভালো জিনিস ব্যবহার করতে পারেন অন্য কোন কমান্ড মত পার্স করা হয়, &&ভিতরে এবং আপনি কিছু স্ট্রিং অপারেটার আর্গুমেন্ট ছাড়া উদ্ধৃতি ভেরিয়েবল প্রয়োজন হবে না ( =, ==, !=, =~) (দেখুন যখন প্রয়োজনীয় ডাবল উদ্ধৃতি হয় ? বিস্তারিত জানার জন্য)।


নোট করুন যে if [[ 1 ]] then [[ 2 ]] fiksh, pdksh এবং zsh এ কাজ করে। if(:)then(:)fiসমস্ত শেল কাজ করে।
স্টাফেন চেজেলাস

12

নীচে পরিবর্তন হয়েছে কি দেখুন

যদি [-r "$ NAME" -a -f "$ NAME"] ; তারপর
# ^^^^^ ^
     wc -c "$ NAME"
ফাই

যদি আপনি ব্লক সমস্ত কমান্ড মুছে ফেলতে চান তবে আপনাকে কমপক্ষে এটিতে একটি কোলন যুক্ত করতে হবে, পছন্দ করুন

if [ -r "$NAME" -a -f "$NAME" ]; then
    :
fi

বা একটি লাইন সংস্করণ

if [ -r "$NAME" -a -f "$NAME" ]; then :; fi


2

অন্যরা ইতিমধ্যে চিহ্নিত করেছে, তবে আপনি যদি সরকারী রেফারেন্সটি সন্ধান করছেন তবে আরটিএম

যদি তালিকা; তারপরে তালিকা; [এলিফ তালিকা; তারপরে তালিকা; ] ... [অন্য তালিকা;] ফাই

যদি তালিকাটি কার্যকর করা হয়। যদি এর প্রস্থান স্থিতি শূন্য হয় তবে তত্কালীন তালিকা কার্যকর করা হয়। অন্যথায়, প্রতিটি এলিফ তালিকা ঘুরিয়ে কার্যকর করা হয় এবং এর প্রস্থান স্থিতি শূন্য হলে সংশ্লিষ্ট ততালিকালিকা কার্যকর করা হয় এবং কমান্ডটি সম্পূর্ণ হয় tes অন্যথায়, অন্য তালিকা উপস্থিত থাকলে তা কার্যকর করা হয়। প্রস্থান স্থিতি হ'ল শেষ আদেশের নির্বাহ স্থিতি, বা শর্তটি সত্য না হলে শূন্য।

আপনি মিস করছেন ;

এবং এর সিনট্যাক্সটি listবর্ণিত হয়েছেman test

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.