শেল স্ক্রিপ্ট - অপ্রত্যাশিত টোকেনের নিকটে সিনট্যাক্স ত্রুটি `অন্যথায় '


15

নিম্নলিখিত শেল স্ক্রিপ্ট সহ, আমি কেন ত্রুটি পাচ্ছি

syntax error near unexpected token `else'

শেল স্ক্রিপ্ট

echo "please enter username"
read user_name
echo "please enter password"
read -s pass
echo ${ORACLE_SID}
SID=${ORACLE_SID}
if ["${ORACLE_SID}" != 'Test'] then
sqlplus -s -l $USER_NAME/$PASS@$SID <<EOF
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
EOF
else
echo "Cannot copy"
fi


আপনি "থেকে অনুলিপি ...." লাইনটি সম্পাদনা করতে চাইতে পারেন কারণ এটি বর্তমানে এমন কিছু দেখাচ্ছে যা আপনি দেখাতে চান না। (তবে, আমি আশা করি এগুলি ইতিমধ্যে সংশোধিত ইনফোস হিসাবে রয়েছে, কারণ তারা সত্যই নিঃস্ব নিরাপত্তা বুদ্ধিমান হবে)
অলিভিয়ার ডুলাক

1
@ অলিভিয়ারডুলাক যদি আপনি সেই লাইনে ব্যবহারকারীর নাম এবং পাসওয়ার্ড উল্লেখ করছেন তবে সেগুলি সমস্ত ওরাকল ডাটাবেস ব্যবহারকারীদের কাছে পরিচিত। ওরাকল ডাটাবেস শুরুর পর থেকে এটি সাধারণ এবং সুপরিচিত।
জ্যাকব

@ অলিভিয়ারডুলাক আপনাকে স্বাগত জানাই, এই ডিবিএ-
ওরাকল.

উত্তর:


25

আপনাকে ifএই জাতীয় শর্তটি শেষ করতে হবে :

if [ "${ORACLE_SID}" != 'Test' ]; then

বা এই মত:

if [ "${ORACLE_SID}" != 'Test' ]
then

দ্রষ্টব্য: আপনার [আগে এবং আগেও ফাঁকা স্থান রাখতে হবে ]

;অর লাইন ব্রেকের কারণ হ'ল ifস্টেটমেন্টের কন্ডিশন অংশটি কেবল একটি কমান্ড। যে কোনও দৈর্ঘ্যের যে কোনও কমান্ড সুনির্দিষ্ট হতে হবে। শেলটি সেই আদেশটি কার্যকর করে, কমান্ডের প্রস্থান স্থিতি পরীক্ষা করে এবং তারপরে thenঅংশ বা অংশটি নির্বাহ করতে হবে কিনা তা স্থির করে else

কারণ কমান্ডটি যে কোনও দৈর্ঘ্যের হতে পারে শর্ত অংশের শেষ চিহ্নিত করতে একটি চিহ্নিতকারী হওয়া দরকার। এটি হ'ল ;নিউলাইন, তারপরে then

স্পেসের পরে [কারণ [হ'ল একটি কমান্ড। সাধারণত শেল একটি অন্তর্নির্মিত। শেলটি [প্যারামিটার ]হিসাবে বাধ্যতামূলক সর্বশেষ পরামিতি সহ কমান্ডটি কার্যকর করে । [শেল পরে কোনও স্থান না রাখলে [whateverকমান্ড হিসাবে চালানোর চেষ্টা করবে এবং ব্যর্থ হবে।

স্থান আগে কারণ ]একই। কারণ অন্যথায় এটি নিজস্ব প্যারামিটার হিসাবে স্বীকৃত হবে না।


এটি স্পট ছিল, তবে এখন আমি পাচ্ছি test.sh: line 6: [: missing ] '`
জ্যাকব

@lesmana। প্রথমে একটি ভুল উত্তর সরবরাহ করার একটি ভাল উপায়, তারপরে অন্য কেউ সঠিক উত্তর দেওয়ার আগে সম্পাদনা চালিয়ে যান। দয়া করে প্রথমবার সঠিক উত্তর দেওয়ার চেষ্টা করুন।
ভ্যালেন্টাইন বাজরামি

1
আমি আমার প্রথম উত্তরটিকে ভুল হিসাবে বিবেচনা করি না। আসলে এটি ছিল "স্পট অন"। এটি কেবল সমস্ত সমস্যার সমাধান করেনি ।
লেসমানা

if এটি সিনট্যাক্স, এটি কোনও সাধারণ আদেশ নয়। এটি একটি সংরক্ষিত শব্দ। অন্যান্য অনেক প্রোগ্রামিং ভাষার মতো নয়, শেলটি সর্বত্র সংরক্ষিত শব্দগুলি সনাক্ত করতে পারে না, কেবলমাত্র যখন তারা কোনও কমান্ডের প্রথম শব্দ হয় (কয়েকটি সূক্ষ্মতা সহ)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

স্পষ্টতার জন্য ধন্যবাদ। আমি সচেতন যে ifবাক্য গঠন। আমি যোগাযোগের চেষ্টা করছিলাম যে এর শর্তের অংশটি ifসিনট্যাক্স দ্বারা নির্দিষ্ট আকারে সীমাবদ্ধ নয়। আমি লেখাটি সম্পাদনা করেছি। আমি আশা করি এটি এখন আরও পরিষ্কার হয়ে গেছে।
লেসমানা

5

অনলাইনে শেলচেক ব্যবহার করে আপনি নিজের শেল স্ক্রিপ্টগুলি চেক করতে পারেন (স্ট্যান্ডেলোন সরঞ্জাম হিসাবেও উপলব্ধ)।

এই ক্ষেত্রে, এটি নির্দেশ করবে যে if-বিবৃতিটির পরে [এবং তার আগে এবং পরে একই লাইনের আগে ]একটি ;(বা একটি নতুন লাইন) দরকার then

আপনি যখন এটি স্থির করেছেন, তখন আপনাকে জানাতে হবে যে USER_NAMEকোনও কিছুর সূচনা না করেই এটি ব্যবহৃত হয়। এটি কারণ user_nameআপনারও একটি পরিবর্তনশীল (কেস সম্পর্কিত বিষয়) রয়েছে। একই জন্য PASSএবং pass

এটি আপনাকে ম্যাংলিং থেকে read -rবিরত readরাখতেও ব্যবহার করতে বলেছে \(উদাহরণস্বরূপ পাসওয়ার্ডগুলির জন্য গুরুত্বপূর্ণ হতে পারে), এবং sqlplusশেলটিকে দুর্ঘটনাক্রমে ফাইলের নাম গ্লোবিং এবং শব্দ বিভাজন থেকে রোধ করার জন্য কল করার সময় আপনার ভেরিয়েবলগুলি দ্বিগুণ করা উচিত (আবার এটি গুরুত্বপূর্ণ যদি পাসওয়ার্ডে উদাহরণস্বরূপ, ফাইল গ্লোব্বিং অক্ষর যেমন *বা স্পেস থাকে)।

কোডটি প্রবেশ করানো এটিকে আরও পাঠযোগ্য করে তুলবে:

#!/bin/bash

read -r -p 'please enter username: ' user_name
IFS= read -rs -p 'please enter password: ' pass

printf 'ORACLE_SID = %s\n' "$ORACLE_SID"
sid=$ORACLE_SID

if [ "$sid" = 'Test' ]; then
    echo 'Cannot copy' >&2
    exit 1
fi

sqlplus -s -l "$user_name/$pass@$sid" <<'SQL_END'
copy from scott/tiger@orcl insert EMP using select * from EMP
exit
SQL_END

এখানে আমি IFSপাসওয়ার্ড পড়ার জন্য অস্থায়ীভাবে একটি ফাঁকা স্ট্রিংয়ে সেট করে শীর্ষস্থানীয় বা পিছনে স্থান অক্ষরগুলির সাথে পাসওয়ার্ডগুলি ব্যবহার সম্ভব করে তুলেছি read

যুক্তিটি $ORACLE_SID/ যদি হয় তবে জামিনে আউট হয়ে $sidযায় Test। এটি কোনও ifশাখায় স্ক্রিপ্টের মূল অপারেশনাল অংশ থাকা এড়ানো যায় ।


নোট যে if ([ x = x ]) then (echo yes) fiকাজ করে।
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস আহ, হ্যাঁ এবং এটি শেল কোড তৈরির কোনও প্রোগ্রামের দৃষ্টিভঙ্গির আকর্ষণীয় রূপ হতে পারে, তবে এটি সাধারণত কীভাবে ... :-) ifদিয়ে বিবৃতি লেখেন না[ ... ]
কুসালানন্দ

2

লেখার সময় shআপনি চান

if [ "$ORACLE_SID" != "Test" ]
then
  ...
fi

লেখার সময় bash

if [[ "$ORACLE_SID" != "Test" ]]
then
  ...
fi

দয়া করে স্পেস মনে করুন। [[প্রথম অপারেটরের মধ্যে অবশ্যই একটি স্থান থাকতে হবে ।

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