আমি চাই আমার স্ক্রিপ্টটি একটি alচ্ছিক ইনপুট নিতে সক্ষম হবে,
যেমন বর্তমানে আমার লিপিটি
#!/bin/bash
somecommand foo
তবে আমি এটি বলতে চাই:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
আমি চাই আমার স্ক্রিপ্টটি একটি alচ্ছিক ইনপুট নিতে সক্ষম হবে,
যেমন বর্তমানে আমার লিপিটি
#!/bin/bash
somecommand foo
তবে আমি এটি বলতে চাই:
#!/bin/bash
somecommand [ if $1 exists, $1, else, foo ]
উত্তর:
আপনি ডিফল্ট-মান সিনট্যাক্স ব্যবহার করতে পারেন:
somecommand ${1:-foo}
উপরের উইলটি , যেমন বাশ রেফারেন্স ম্যানুয়ালটিতে বর্ণিত হয়েছে - 3.5.3 শেল প্যারামিটার সম্প্রসারণ [জোর খনি]:
যদি প্যারামিটারটি সেট না করা বা শূন্য হয় তবে শব্দের প্রসারণটি প্রতিস্থাপিত হয়। অন্যথায়, প্যারামিটারের মান প্রতিস্থাপিত হয়।
যদি আপনি কেবলমাত্র প্যারামিটারটি সেট না করা অবস্থায় একটি ডিফল্ট মান পরিবর্তিত করতে চান (তবে এটি নাল হয় না তবে যেমন এটি খালি স্ট্রিং না হয়ে থাকে) তবে পরিবর্তে এই বাক্য গঠনটি ব্যবহার করুন:
somecommand ${1-foo}
আবার বাশ রেফারেন্স ম্যানুয়াল থেকে - 3.5.3 শেল প্যারামিটার সম্প্রসারণ :
কোলন ছাড়ার ফলে কেবল সেট না করা পরামিতিগুলির পরীক্ষার ফলাফল পাওয়া যায়। অন্য একটি উপায় রাখুন, যদি কোলন অন্তর্ভুক্ত থাকে তবে অপারেটর উভয় প্যারামিটারের অস্তিত্বের জন্য পরীক্ষা করে এবং এর মানটি নাল নয়; যদি কোলন বাদ দেওয়া হয় তবে অপারেটর কেবল অস্তিত্বের জন্য পরীক্ষা করে।
foo
হলে ফিরে যান বা একটি খালি স্ট্রিং " এবং , " আনসেট না হলে ফিরে আসুন"। $1
${1-foo}
foo
$1
আপনি যেমন ভেরিয়েবলের জন্য একটি ডিফল্ট মান সেট করতে পারেন:
#!/usr/bin/env bash
ARG1=${1:-foo}
ARG2=${2:-bar}
ARG3=${3:-1}
ARG4=${4:-$(date)}
echo "$ARG1"
echo "$ARG2"
echo "$ARG3"
echo "$ARG4"
এটি কীভাবে কাজ করে তার কয়েকটি উদাহরণ এখানে দেওয়া হল:
$ ./somecommand.sh
foo
bar
1
Thu Mar 29 10:03:20 ADT 2018
$ ./somecommand.sh ez
ez
bar
1
Thu Mar 29 10:03:40 ADT 2018
$ ./somecommand.sh able was i
able
was
i
Thu Mar 29 10:03:54 ADT 2018
$ ./somecommand.sh "able was i"
able was i
bar
1
Thu Mar 29 10:04:01 ADT 2018
$ ./somecommand.sh "able was i" super
able was i
super
1
Thu Mar 29 10:04:10 ADT 2018
$ ./somecommand.sh "" "super duper"
foo
super duper
1
Thu Mar 29 10:05:04 ADT 2018
$ ./somecommand.sh "" "super duper" hi you
foo
super duper
hi
you
-
আমাকে বিভ্রান্ত (এটা অস্বীকার করা হয়?)।
if [ ! -z $1 ]
then
: # $1 was given
else
: # $1 was not given
fi
-n
হিসাবে একই ! -z
।
-n
এবং ! -z
তাই আমি বলব যে এখানে এটি হয় না।
[ -n $1 ]
সর্বদা সত্য হবে । আপনি যদি ব্যাশ ব্যবহার [[ -n $1 ]]
করেন তবে আপনার প্রত্যাশার সাথে আচরণ করবেন, অন্যথায় আপনাকে উদ্ধৃতি দিতে হবে[ -n "$1" ]
দয়া করে ভুলে যাবেন না, যদি এর ভেরিয়েবল $ 1 .. you n প্রতিস্থাপনটি ব্যবহার করার জন্য আপনার নিয়মিত পরিবর্তনশীলকে লিখতে হবে
#!/bin/bash
NOW=$1
echo ${NOW:-$(date +"%Y-%m-%d")}
DAY=${1:-$(date +%F -d "yesterday")}
Multipleচ্ছিক একাধিক যুক্তির জন্য, ls
কমান্ডের সাথে সাদৃশ্য করে যা এক বা একাধিক ফাইল নিতে পারে বা ডিফল্টরূপে বর্তমান ডিরেক্টরিতে সমস্ত কিছু তালিকাভুক্ত করে:
if [ $# -ge 1 ]
then
files="$@"
else
files=*
fi
for f in $files
do
echo "found $f"
done
পথের ফাঁকা জায়গাগুলি সহ ফাইলগুলির জন্য সঠিকভাবে কাজ করে না, হায়। কীভাবে এখনও এই কাজটি করা যায় তা ভেবে দেখেননি।
date
আর্গুমেন্টের জন্য একটি স্থির মান বা কমান্ডের (যেমন ) বিকল্পের জন্য পরিবর্তনশীল বিকল্প ব্যবহার সম্ভব । উত্তরগুলি এখন পর্যন্ত স্থির মানগুলিতে ফোকাস করেছে, তবে এটিই আমি তারিখটিকে একটি alচ্ছিক যুক্তি হিসাবে ব্যবহার করেছি:
~$ sh co.sh
2017-01-05
~$ sh co.sh 2017-01-04
2017-01-04
~$ cat co.sh
DAY=${1:-$(date +%F -d "yesterday")}
echo $DAY