"অন্য" খালি "তারপরে" ধারাটি অনুসরণ করলে বাশ সিনট্যাক্স ত্রুটি


36

নিম্নলিখিত স্ক্রিপ্টটি কেন কার্যকর হবে না, তবে এর সিনট্যাক্স ত্রুটি দেবে else:

LOGS3_DIR=~/logs
if [ -d "$LOGS3_DIR" ]; then
 cd
 cd "$LOGS3_DIR"
 echo "$LOGS3_DIR"
 for filename in `find "." -mtime 1 -type f`
  do
  if lsof "$filename" > /dev/null
  then
    # file is open
  else
    echo "deleting $filename"
    rm "$filename"
  fi
 done
fi

উত্তর:


23

আউটপুটে কমান্ড প্রতিস্থাপন ব্যবহার করবেন নাfind । এখানে, সবকিছু দিয়ে করা যেতে পারে find:

find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null

কয়েকটি findবাস্তবায়ন সহ (ফ্রিবিএসডি findযেখানে এটি এসেছে এবং জিএনইউ সহ find), আপনি এর -deleteপরিবর্তে ব্যবহার করতে পারেন -exec rm...

কারণ আপনি একটি ত্রুটি পেয়ে থাকেন সেখানে মধ্যে কোনো কমান্ড ব্যবহার যোগ্য thenএবং elseএবং কিছু শাঁস (বোর্ন শেল যেখানে যে সিনট্যাক্স থেকে আসে দিয়ে শুরু) অন্তত একটি প্রয়োজন (এবং মন্তব্য একটি কমান্ড নয়)। মনে রাখবেন যে এটি সম্পূর্ণ স্বেচ্ছাসেবী এবং এই শেলগুলি কেন এটি করার কোনও কারণ নেই। yashএবং zshএই সীমাবদ্ধতা ( if false; then else echo x; fiএবং এমনকি if false; then else fiতাদের সাথে সূক্ষ্ম কাজ) না।

অন্যরা যেমন বলেছে, আপনি :(বা for nothing in; do nothing; done) এর মতো নূপ কমান্ড ব্যবহার করতে পারেন বা মূল শব্দটি দিয়ে পজিকটি বিপরীত করতে পারেন ( পসিক্স !শেলগুলিতে উপলভ্য, তবে বোর্ন শেল নয় (আপনি দেখতে পাবেন যে :সেই শেলটিতে এটি ব্যবহার করা সাধারণ ছিল))। mkshএবং yashসমর্থন হিসাবে ঘটবে if false; then () else echo x; fi(আমি যদিও এটি ভবিষ্যতের সংস্করণে পরিবর্তিত হতে পারে উপর নির্ভর করে না)।

আরেকটি পদ্ধতির সাথে:

lsof... || {
  cmd1
  cmd2
}

যদিও এক পার্থক্য সামগ্রিক প্রস্থান অবস্থা যা হবে হয় lsofযদি lsofব্যর্থ।


17
@ নভেস ব্যবহারকারীরা যা চেষ্টা করছে তা করার এটি একটি আরও ভাল উপায়, যদিও এটি প্রশ্নের কোনও উত্তর দেয় না।
জয়বেবি

যদিও -execপ্রায়শই দরকারী, যেমনটি xargsকখনও কখনও শেলের লুপের প্রয়োজন হয়। যে ক্ষেত্রে একটি while read nameলুপটি পছন্দসই বিকল্প (জিএনইউ সহ ব্যাশে আপনি উভয়ের জন্য -0 বিকল্পটি ব্যবহার করতে পারেন; বহনযোগ্যভাবে আপনাকে নিউলাইনে ছেড়ে দিতে হবে)।
জানু হুডেক

@ জানহুদেক, বহনযোগ্য উপায় রয়েছে। -print0হয় -exec printf '%s\0' {} +(তবে বহনযোগ্যভাবে আপনি সেই আউটপুটটির সাথে আপনি যদি বিবেচনা করতে চান তবে ডিল করতে পারবেন না perl) find .//.এবং কিছু পোস্ট-প্রসেসিং সহ, আপনি নতুন লাইনের জন্য এড়াতে পারবেন xargs। মনে রাখবেন এটি একটি নয় while read, এটি while IFS= read -r
স্টাফেন চেজেলাস

@ ক্রিস, উত্তরটি শেষ হওয়ার পরে গ্রহণযোগ্য হওয়ার পরে আমি প্রকৃত প্রশ্নের উত্তর যুক্ত করেছি।
স্টাফেন চেজেলাস

91

মনে হচ্ছে যে আপনি একটি কাজ করতে চান নো অপ ফাইলটি খোলা থাকা অবস্থায় যাতে আপনি আপনার যোগ করা উচিত :, যা একটি নাল কমান্ড bash:

if lsof "$filename" > /dev/null; then
  # file is open
  :
else
  printf 'deleting %s\n' "$filename"
  rm -- "$filename"
fi

আপনি ব্যবহার না করেন তাহলে :, bashআপনি কোড বিশ্লেষণ করতে পারে না এবং মত এরর দেখাবে bash: syntax error near unexpected token 'else'


কখনই নতুন নয় :এবং এটি প্রথম কমান্ডটি বাশ-বিল্টিনগুলিতে তালিকাভুক্ত।
বলভ

26

অন্য বিকল্প: আপনার যুক্তি বিপরীত।

if ! lsof "$filename" >/dev/null;then
    echo "deleting $filename"
    rm "$filename"
fi

17

টি এল; ডিআর

কমান্ডটি একটি সিনট্যাক্স ত্রুটি কেন দেয় তার উত্তরটি অন্য কোনও উত্তরই দেয় না। এটি তখন এবং অন্যটির মধ্যে একটি অনুপস্থিত কমান্ডের কারণে ঘটে ।

একটি মিসিং কমান্ড

আপনার মূল কোডটি দেখতে এমন দেখাচ্ছে:

if lsof "$filename" > /dev/null
then
  # file is open
else
  echo "deleting $filename"
  rm "$filename"
fi

সমস্যা আপনার মধ্যে একটি মন্তব্য আছে যে তারপর এবং অন্য কিন্তু মন্তব্য একটি কমান্ড হিসাবে গণ্য করা হয় না। সংক্ষেপে, আপনি যে সমস্যাটি (কাঠামোগতভাবে বলছেন) নীচে নিম্নরূপ লিখতে পারেন:

$ if true; then else echo; fi
bash: syntax error near unexpected token `else'

বোর্ন বিল্টিনের সাহায্যে আপনার সিনট্যাক্সটি ঠিক করুন

আপনি অন্যের আগে প্রকৃত আদেশগুলি রেখে এই সমস্যাটি সমাধান করতে পারেন , তবে নিজেই কোনও মন্তব্য করবেন না। যদি-তারপর অধ্যায় খালি রাখা যাবে না; আপনি যদি কোনও স্থানধারক চান তবে আপনি কোলন বিল্টিন ব্যবহার করতে পারেন । উদাহরণ স্বরূপ:

$ if true; then :; else echo; fi

কেবলমাত্র স্থাপন :মধ্যে বিভাগে তারপর এবং অন্য বাক্যগঠন ত্রুটি আপনি সম্মুখীন হচ্ছি ঠিক করবে।


1
জ্ঞানক উত্তর, যা সর্বাধিক উত্সাহিত এক, ইতিমধ্যে মূল প্রশ্নটি সম্বোধন করছে।
jlliagre

সিনট্যাক্স ত্রুটি সম্বোধন করার জন্য কেবলমাত্র উত্তর। এফডাব্লুআইডাব্লু, আপনি একটি লাইনের শুরুতে একমাত্র আধা-কোলন দিয়ে একই জাতীয় ত্রুটিটি পুনরুত্পাদন করতে পারেন। এটি একটি শক্ত ইঙ্গিত দেবে। $ ; -bash: syntax error near unexpected token ';'
ম্যাথু হ্যানিগান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.