স্পেস সহ একক স্ট্রিংয়ে ব্যাশ যুক্তি যুক্ত করা


39

আমি বাশ ফাংশনে সমস্ত আর্গুমেন্টকে প্রতিটি যুক্তিকে পৃথক করে একক স্ট্রিংয়ে যুক্ত করার চেষ্টা করছি। আমার কাছে স্ট্রিংটিতে পুরো স্ট্রিংয়ের একক কোট অন্তর্ভুক্ত থাকাও দরকার।

আমার এখন পর্যন্ত যা আছে তা এখানে ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

অবশ্যই এটি কাজ করে না তবে আমি ভাবছি যে এটি অর্জনের কোনও উপায় আছে কিনা?

উত্তর:


54

আমি বিশ্বাস করি এটি আপনার যা ইচ্ছা তা করে। এটি সমস্ত আর্গুমেন্টকে একটি স্ট্রিংয়ে রাখবে, স্পেস দ্বারা আলাদা করে চারদিকে একক উদ্ধৃতি দিয়ে:

str="'$*'"

$*প্রথম অক্ষর দ্বারা পৃথক সমস্ত স্ক্রিপ্ট আর্গুমেন্ট তৈরি করে $IFSযার ডিফল্টরূপে একটি স্থান।

একটি ডাবল উদ্ধৃত স্ট্রিংয়ের ভিতরে, একক-উদ্ধৃতিগুলি এড়িয়ে যাওয়ার দরকার নেই।

উদাহরণ

উপরেরটি একটি স্ক্রিপ্ট ফাইলে রাখি:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

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

$ sh script.sh one two three four 5
'one two three four 5'

এই স্ক্রিপ্টটি পসিক্স। এটি দিয়ে কাজ করবে bashতবে এটির প্রয়োজন নেই bash

একটি প্রকরণ: ফাঁকা স্থানের পরিবর্তে স্ল্যাশ দিয়ে মনোনিবেশ করা

আমরা অ্যাডজাস্ট করে স্পেস থেকে অন্য চরিত্রে পরিবর্তন করতে পারি IFS:

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

উদাহরণ স্বরূপ:

$ sh script.sh one two three four       
'one/two/three/four'

ঠিক আছে এটি দুর্দান্ত কাজ করেছে এবং আমার যা প্রয়োজন ঠিক তা করেছে। আমি কেবল যুক্তি ব্যবহার করে নামের ফাঁকা জায়গায় একটি ডিরেক্টরিতে ডিরেক্টরি পরিবর্তন করতে এটি ব্যবহার করার চেষ্টা করছি। আমার চূড়ান্তভাবে এর জন্য যা দরকার ছিল তা হ'ল একটি ফাংশন তৈরি করা যা ডিরেক্টরিতে শব্দগুলি ফাঁক করে থাকলে অ্যাস্ট্রোফেস টাইপ না করে ডিরেক্টরি পরিবর্তন করে দেয়। আমি কেবল যা চেষ্টা করেছি তা হ'ল: সিডিএম () {str = "'$ *'" "সিডিআরটিআর} এটি কেবল প্রথম তর্কটিতেই প্রবেশ করে তাই উদাহরণস্বরূপ: সিডিএম পরীক্ষা 2 ফলাফল: 'পরীক্ষা: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই
শ্ব্যাগমিস্টার

@ স্কোয়াগমিস্টার: আপনি চাইলে এটি এটিকে (স্ট্রিং) পরিবর্তনশীল হিসাবে সংরক্ষণ করতে পারেন, তবে, যদি আপনার বিশেষভাবে এটি করার প্রয়োজন না হয় তবে আমার মনে হয় cd "$*"যথেষ্ট ভাল হবে।
স্কট

@ স্কোয়াগমিস্টার একক উদ্ধৃতি সেখানে কার্যকর নয়। চেষ্টা করুন: cdm(){ str="$*"; cd "$str"; }বা, যেমন স্কট বলেছে cdm(){ cd "$*"; },। এছাড়াও, সচেতন থাকুন যে $*একক স্থানের সাথে একাধিক পরপর স্পেস প্রতিস্থাপন করে। যদি আপনার ডিরেক্টরি নামের একাধিক টানা ফাঁকা জায়গা বা ট্যাব বা নিউলাইন থাকতে পারে তবে সেই অক্ষরগুলি ফাংশনে যাওয়ার আগে তাদের সত্যিই পালানো দরকার cdm
1024

সুতরাং এটি যদি টেস্ট 2 ট্রায়াল 1 এর মতো কিছু হয় তবে আমি এই সিডি কমান্ডটি কীভাবে সঠিকভাবে কাজ করব? এছাড়াও এটি আশ্চর্যজনক সাহায্য এটি সত্যই আমি এর প্রশংসা করি। @ স্কট
শোয়াগমিস্টার

সবচেয়ে ভালো উপায় @Schwagmister কমান্ড লাইন একক উদ্ধৃতি লাগাতে যখন কলিং হয় cdmহিসাবে: cdm 'test 2 trial 1'। এটি অদ্ভুত নামের সমস্ত ম্যানোর পরিচালনা করবে। তবে, যতক্ষণ না সাদা স্পেসগুলি একক স্পেসে সীমাবদ্ধ থাকে, ততক্ষণে cdmএটি হিসাবে চালানো যেতে পারে cdm test 2 trial 1
1024

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