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


11

আমি যখন উবুন্টু টার্মিনালে কোডের নীচে ব্যবহার করি তখন এটি দুর্দান্ত কাজ করে:

rm !(*.sh) -rf

তবে যদি আমি একই লাইন কোডটি শেল স্ক্রিপ্টে (ক্লিন.শ) রাখি এবং টার্মিনাল থেকে শেল স্ক্রিপ্টটি চালিত করি তবে এটি একটি ত্রুটি ছুঁড়ে দেয়:

clean.sh লিপি:

#!/bin/bash
rm !(*.sh) -rf

আমি যে ত্রুটি পেয়েছি:

./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'

তুমি কি সাহায্য করতে পারো?


উত্তর:


23

rm !(*.sh)একটি extglobসিনট্যাক্স যার অর্থ .shএক্সটেনশন থাকা ফাইলগুলি বাদে সমস্ত ফাইল সরিয়ে ফেলুন ।

আপনার ইন্টারেক্টিভ bashদৃষ্টান্তে, শেল বিকল্পটি extglobচালু রয়েছে:

$ shopt extglob 
extglob         on

এখন যেমন আপনার স্ক্রিপ্টটি সাব-শেলের সাথে চলছে, আপনাকে extglobস্ক্রিপ্টের শুরুতে এটি যোগ করে সক্ষম করতে হবে :

shopt -s extglob

সুতরাং আপনার স্ক্রিপ্টটি দেখে মনে হচ্ছে:

#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)

সম্পাদনা:

.shএক্সটেনশানযুক্ত ফাইলগুলি বাদ দিয়ে সমস্ত ফাইল সরিয়ে ফেলতে GLOBIGNORE(আপনি সক্ষম করতে চান না extglob):

#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *

উদাহরণ:

$ ls -1
barbar
bar.sh
egg
foo.sh
spam

$ GLOBIGNORE='*.sh'

$ rm *

$ ls -1
bar.sh
foo.sh

আমি কি আমার আদেশটি পরিবর্তন করতে পারি যা এটি না চালিয়ে একই কাজ করে? shopt -s extglob?
তাল

@ টাল আমার সম্পাদনাগুলি পরীক্ষা করুন ..
হিমাইল

1
ধন্যবাদ :) (স্ট্যাক ওভারফ্লাউ আমাকে মন্তব্যে 15 টি চরিত্র লিখতে বাধ্য করুন :( :( :()
তাল

তবে এখানে দুটি ভাল উত্তর!
তাল

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যেহেতু এটি প্রকৃতপক্ষে প্রশ্নের উত্তর দেয়, যখন অন্যটি কেবল একটি কর্মপরিকল্পনা বর্ণনা করে।
গুন্ট্রাম ব্লহম

4

ঠিক আছে, এটি ক্রস পোস্ট, তবে আমাকে একটি উত্তর লিখতে হবে। ;)

findপরিবর্তে আপনি ব্যবহার করতে পারেন

find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;

2

আপনার চালু extglobকরা প্রয়োজন :

shopt -s extglob

1
@ পাইলট:: দেখুন man bash। এটি বিস্তৃত গ্লোব্বিংয়ের মতো সক্ষম করে !(...)
চোরোবা

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