শেল স্ক্রিপ্ট: ভিতরে বিকল্পগুলির সাথে একটি ভেরিয়েবল তৈরি করা


11

নিম্নলিখিত পরামিতিগুলির সাথে আমার একটি rsync কমান্ড রয়েছে:

rsync -avz --{partial,stats,delete,exclude=".*"}

স্ক্রিপ্টের পরে আবার ব্যবহার করতে আমি সেই প্যারামিটারগুলিকে ভেরিয়েবলের ভিতরে রাখতে চাই। এটার মতো কিছু:

#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2

আমি কোন সাফল্য ছাড়াই উদ্ধৃতি, একক উদ্ধৃতি, বন্ধনী দিয়ে চেষ্টা করেছি।


তাই একই প্রশ্ন: stackoverflow.com/questions/13365553/...
Barmar

আগে এই রুটে নেমে যাওয়া: আপনার চূড়ান্ত ফলাফলের কমান্ড স্ট্রিংয়ের কোনও ফাঁকা স্ট্রিং নেই তা নিশ্চিত করুন। যদি এটি হয়, আরএসসিএনসি সেগুলি পরামিতি হিসাবে ব্যবহার করতে পারে এবং যেহেতু তারা অদৃশ্য হয়, তাই ডিবাগ করা বেশ শক্ত। আমার একটি খালি প্রথম প্যারামিটার ছিল এবং আরএসসিএনসি এটি অনুলিপি করার জন্য উত্সগুলিতে বর্তমান ডিরেক্টরি অন্তর্ভুক্ত হিসাবে ব্যাখ্যা করেছে।
জো

উত্তর:


12

একটি ভেরিয়েবলের মধ্যে একটি জটিল কমান্ড স্থাপন করা কখনই একটি প্রস্তাবিত পদ্ধতি নয়। দেখুন BashFAQ / 050 - আমি একটি পরিবর্তনশীল একটি কমান্ড লাগাতে চেষ্টা করছি, কিন্তু জটিল ক্ষেত্রে সবসময় ব্যর্থ!

আপনার প্রয়োজনীয়তাটি সত্যই সহজ হয়ে যায়, যদি আপনি কেবল কোনও ভেরিয়েবলের পরিবর্তে কোনও ফাংশন ব্যবহার করার সিদ্ধান্ত নেন এবং এতে যুক্তিগুলি পাস করেন।

কিছুটা এইরকম

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --{partial,stats,delete,exclude=".*"} "$@"
}

এবং এখন এটি হিসাবে প্রয়োজনীয় আর্গুমেন্ট পাস

rsync_custom /dir1 /dir2

ফাংশন সংজ্ঞা একটি উপায়ে বেশ সহজ, আমরা প্রথমে ইনপুট আর্গুমেন্ট গণনাটি ভেরিয়েবলটি ব্যবহার করে $#যা শূন্য হওয়া উচিত নয় তা পরীক্ষা করি। আমরা একটি ত্রুটি বার্তা নিক্ষেপ করে বলছি যে কোনও যুক্তি সরবরাহ করা হয়নি। যদি বৈধ আর্গুমেন্ট থাকে তবে "$@"ফাংশনে সরবরাহ করা আসল আর্গুমেন্টগুলি উপস্থাপন করে।

এটি যদি কোনও ফাংশন হয় তবে আপনি প্রায়শই ঘন ঘন অর্থাৎ স্ক্রিপ্ট / কমান্ড-লাইনেও ব্যবহার করবেন, উদাহরণস্বরূপ .bashrc, এটি শেল স্টার্টআপ ফাইলগুলিতে যুক্ত করুন .bash_profile

অথবা যেমনটি উল্লেখ করা হয়েছে, তত ভাল পাঠযোগ্যতার জন্য ব্রেস প্রসারকে আলাদা আলাদা আর্গগুলিতে প্রসারিত করা সার্থক হতে পারে

rsync_custom() {
    [ "$#" -eq 0 ] && { printf 'no arguments supplied' >&2; exit 1 ; }
    rsync -avz --partial --stats --delete --exclude=".*" "$@"
}

5
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

এই চেষ্টা কমান্ড চালানোর জন্য -avzআর্গুমেন্ট সহ --partial, --statsইত্যাদি .. এবং VARসেটে rsyncপরিবেশে।

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

উদ্ধৃত ফর্মটি কাজ করে না কারণ ব্রেসগুলি উদ্ধৃতিতে প্রসারিত হয় না, এবং অনুকরণের ভিতরে থাকে না এবং ভেরিয়েবল প্রসারিত হওয়ার পরে সেগুলিও প্রসারিত হয় না।

আপনার যদি ভেরিয়েবলে কমান্ড লাইন আর্গুমেন্ট সংরক্ষণ করতে হয় তবে একটি অ্যারে ব্যবহার করুন:

args=(rsync -avz --{partial,stats,delete,exclude=".*"})

এখন "${args[@]}"থেকে প্রসারিত হবে rsync, -avz, --partialস্বতন্ত্র শব্দ হিসাবে, ইত্যাদি।

অ্যারে আপনাকে তালিকায় বিকল্পগুলি সংযোজন করার অনুমতি দেয়, শর্তাধীনভাবে যদি প্রয়োজন হয় তবে আপনি উদাহরণস্বরূপ:

args=(this that)
if something ; then
    args+=(another_arg)
fi
"$cmd" "${args[@]}"

1

আপনি কমপক্ষে একটি চলকটিতে বিকল্পগুলি আংশিকভাবে সংরক্ষণ করতে পারেন:

opts=$(echo --{ignore-case,word-regexp,count,exclude='"sys*.*"'})

পরীক্ষা করা গুরুত্বপূর্ণ, কারণ মাস্কিং কঠিন হতে পারে:

echo $opts
--ignore-case --word-regexp --count --exclude="sys*"

grep $opts bytes *.log 

যেহেতু একাধিক বিকল্প রয়েছে, যেমন ইতিহাস ব্যবহার করা, কোনও উপনাম ব্যবহার করা, কোনও ফাংশন ব্যবহার করা, তাই আমি যেভাবে ভাবতে পারি তার কোনও স্পষ্ট ব্যবহার নেই। বিভিন্ন প্রোগ্রামের মধ্যে খুব কমই একটি জটিল বিকল্প ভাগ করে নেওয়া হয়, সুতরাং ইন্টারেক্টিভ শেলের জন্য অ্যাড-হক সমাধানের জন্য, এলিয়াসিং আরও ভাল উপায় বলে মনে হয়:

alias cgrep='grep --ignore-case --word-regexp --count --exclude="sys*"'
cgrep bytes *.log

আপনার নমুনা

VAR=rsync -avz --{partial,stats,delete,exclude=".*"}

কাজ করতে পারে না, কারণ প্রথম ফাঁকাতে অ্যাসাইনমেন্টটি শেষ। আপনাকে ফাঁকা মুখোশ দিতে হবে:

VAR='rsync -avz --{partial,stats,delete,exclude=".*"}'

পরীক্ষার জন্য বেশ বিপজ্জনক জিনিস, সেই - ডিলিট বিকল্পটি দিয়ে, তাই না? যেহেতু বিকল্পগুলিতে আবার "," এবং একক উদ্ধৃতি থাকতে পারে, তাই খুব শীঘ্রই মাস্কিং কঠিন হয়ে উঠতে পারে। আমি একটি উপনামের জন্য যাব বা ইতিহাসের উপর নির্ভর করব।

একাধিক সেশনের উপর অবিচ্ছিন্ন ব্যবহারের জন্য একটি উপাধি ~ / .bashrc ফাইলে সংরক্ষণ করা যেতে পারে। কার্যগুলি বাশার্কেও সংরক্ষণ করা যেতে পারে তবে আপনি কেবলমাত্র সেগুলি প্রয়োজন, যদি আপনি প্যারামিটারগুলি পরিচালনা করতে চান তবে এটিতে মূল্যায়ন করার জন্য ফাংশনটিতে উত্তীর্ণ হয়ে গেল।

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