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


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.