কমান্ড লাইন আর্গুমেন্টকে বড়হেতু কিভাবে করবেন?


125

আমি SO অনুসন্ধান করেছি এবং দেখতে পেয়েছি যে একটি স্ট্রিং নিম্নলিখিত অক্ষরের বড় হাতের কাজ করবে

str="Some string"
echo ${str^^}

তবে আমি কমান্ড-লাইনের যুক্তিতে একই রকম কাজ করার চেষ্টা করেছি, যা আমাকে নিম্নলিখিত ত্রুটি দিয়েছে

চেষ্টা করা হয়েছে

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

আমরা কীভাবে এটি করতে পারি?


8
এটা আমার জন্য ঠিক কাজ করে । আপনার সম্পূর্ণ স্ক্রিপ্ট পোস্ট করুন, ত্রুটি সম্ভবত অন্য কোথাও রয়েছে। আপনার শেবাং ইঙ্গিত করছে bash?
— manatwork

উত্তর:


151

আপনি যে সিনট্যাক্সটি str^^চেষ্টা করছেন তা বাশ ৪.০ এবং এর থেকে উপরে উপলব্ধ। সম্ভবত আপনার একটি পুরানো সংস্করণ (বা আপনি shস্পষ্টভাবে স্ক্রিপ্ট চালানো ):

এটা চেষ্টা কর:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'

1
এমটিকে-র কথা থেকে আমি বুঝতে পারি যে কেস মডিফিকেশন আসলে ভেরিয়েবলের সাথে তার জন্য কাজ করে।
— manatwork

1
@ মান্যাটওয়ার্ক যা প্রাথমিক প্রশ্নে পরিষ্কারভাবে বলা হয়নি। খারাপ প্রতিস্থাপনের ত্রুটি বার্তাটি আপনি পুরানো বাশ সংস্করণগুলির সাথে সমান।
— বার্নহার্ড

4
আপনি সঠিক. আমি সংস্করণটি পরীক্ষা করেছি, এর 3.2.25। আপনার সমাধান কাজ করে এবং আমি চেষ্টাও করেছি tr '[a-z]' [[A-Z]'।
— mtk

20
@ এমটি কে এটি হওয়া উচিত tr '[a-z]' '[A-Z]'।
— l0b0

2
আমি দৌড়াচ্ছি GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0), এবং আমি ওপি'র মতো একই ত্রুটি পেয়েছি, সুতরাং আপনারা bashযেমন বলছেন তেমন কোনও 4.0 বা তার উপরে পাওয়া যায় বলে আমি মনে করি না ।
— সীমানা

79
echo "lowercase" | tr a-z A-Z

আউটপুট:

LOWERCASE

1
আমি মনে করি POSIX প্রয়োজন হয় না /হিসাবে tr /a-z/ /A-Z/আমার সম্পাদন করা আগে: এই মাত্র কারণ এটি প্রতিস্থাপন কাজ /দ্বারা /কিন্তু অনর্থক: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html এছাড়া আরো অস্পষ্ট এবং কম দরকারী বিদ্যমান tr '[:lower:]' '[:upper:]'।
— সিরো সান্তিলি 新疆 改造 中心 法轮功 六四

সঠিক। টিআর খুব আলাদা, তবে এটি কাজ করে।
— ডগ

আমলাতরা এটি নিয়ে কাজ করছে না।
— ইভজেনি

22

আপনি যতটা ব্যবহার করেন না এজেড না হলে ট্রের সাথে সাবধান থাকুন। এমনকি অন্য লোকেলের জন্য এমনকি '[: নিম্ন:]' '[[উচ্চ:]' ব্যর্থ হয়, কেবল অ্যাডকের ট্যাপার এবং ব্যাশ (v4 +) কাজ করে

$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö

1
এফডাব্লুআইডাব্লু, tr '[:lower:]' '[:upper:]'কমপক্ষে (এটি সহ LC_ALL=sv_SE) ওএস এক্স-এ আপনার উদাহরণের জন্য এখন কাজ করছে
— এথান

1

অন্যথা, আপনি ksh বা zsh যা কয়েক দশক ধরে (অনেক আগে কেনার ক্ষেত্রে রূপান্তর সমর্থন ছিল স্যুইচ পারে bash's ${var^^}একটি ভিন্ন সিনট্যাক্স সঙ্গে যদিও 4.0 যোগ):

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

(এছাড়াও এর সাথে কাজ করে zsh; নোট করুন যে পিডিএক্স / ম্যাক্সে, এটি কেবলমাত্র ASCII অক্ষরের জন্য কাজ করে)।

এর সাথে zsh, আপনি Uপ্যারামিটার সম্প্রসারণ পতাকাও ব্যবহার করতে পারেন :

#! /bin/zsh -
printf '%s\n' "${(U)1}"

সম্ভবত, আপনি ব্যবহার করতে পারেন:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

এছাড়াও আছে:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

তবে জিএনইউ সহ কয়েকটি বাস্তবায়নে trকেবলমাত্র একক-বাইট অক্ষরের জন্য কাজ করে (সুতরাং ইউটিএফ -8 স্থানীয়ভাবে, কেবলমাত্র ASCII বর্ণগুলিতে)।


0

কেউ যদি এখনও চেষ্টা করে ত্রুটি পেতে থাকে তবে ${str^^}আপনি চেষ্টা করতে পারেন python -cবা perlসম্ভবত এটি সম্ভবত সংস্করণ 4 এর চেয়ে কম।

তবে, এখন পর্যন্ত 4 বা তার বেশি বাশ বিদ্যমান সমাধানের সাথে দ্রুত কাজ করছে।

L2U="I will be upper"

python -cব্যাশে ব্যবহার

python -c "print('$L2U'.upper())"
I WILL BE UPPER

একইভাবে এটির সাথে মূলধনটিও ব্যবহার করা যেতে পারে :

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

ব্যবহার perl

echo $L2U | perl -ne 'print "\U$_"'
I WILL BE UPPER
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.