বাশ ত্রুটি ছুঁড়েছে, লাইন 8: $ 1: আনবাউন্ড ভেরিয়েবল


15

আমি কীভাবে কীভাবে ব্যবহার করতে হয় তা শিখার চেষ্টা করছি যাতে পার্সড ইনপুট সহ আমার স্ক্রিপ্টগুলি থাকতে পারে (যদিও আমি মনে করি যে আরও উন্নততর হতে পারে)। পার্টিশন ব্যবহারের শতাংশের শতাংশ ফিরিয়ে দেওয়ার জন্য আমি একটি সাধারণ স্ক্রিপ্ট লিখতে চেষ্টা করছি। সমস্যাটি হ'ল আমার বাশ ফাংশনগুলির একটির মতো মনে হয় না যে আমি $1ফাংশনটির মধ্যে পরিবর্তনশীল হিসাবে উল্লেখ করেছি । আমি উল্লেখ করার কারণটি $1হ'ল কারণ get_percentফাংশনটি মাউন্ট পয়েন্টগুলির পরিবর্তে displayচ্ছিক আর্গুমেন্ট হিসাবে প্রদর্শিত হতে পারে।

এই পান্ডুলিপি

#!/usr/bin/bash

set -e
set -u
set -o pipefail

get_percent(){
    if [ -n "$1" ] 
    then
        df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
    else
        df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
    fi
}

usage(){
    echo "script usage: $(basename $0) [-h] [-p] [-m mount_point]" >&2
}

# If the user doesn't supply any arguments, we run the script as normal
if [ $# -eq 0 ];
then
    get_percent
    exit 0
fi
# ...

আউটপুট

$ bash thing.sh
thing.sh: line 8: $1: unbound variable

$ bash -x thing.sh
+ set -e
+ set -u
+ set -o pipefail
+ '[' 0 -eq 0 ']'
+ get_percent
thing.sh: line 8: $1: unbound variable

আমার মনে হয় না এর সাথে কিছু করার আছে getopts, তাই না? -uকল করার আগে আপনার স্ক্রিপ্টটি প্রস্থান করে getopts
ইলকচাচু

@ মিক্কাছু না আমার ধারণা এটি হয় না doesn't তবে আমি এখনই শিরোনামটি পরিবর্তন করতে পারব না তা নিশ্চিত।
টিমোথিউ পুলিয়াম

পোস্টের নীচে সেই ছোট "সম্পাদনা" পাঠ্য থাকা উচিত, একটি প্রশ্নের ট্যাগগুলির ঠিক নীচে
ইল্কাচ্চু

উত্তর:


29

set -uআপনি যেমন বর্ণনা করেছেন ঠিক তেমন বাতিল করতে হবে যদি আপনি সেট করে না এমন একটি চলক উল্লেখ করেন। আপনি আপনার স্ক্রিপ্টটি কোনও যুক্তি ছাড়াই get_percentপ্রার্থনা করছেন , তাই কোনও যুক্তি ছাড়াই আহ্বান করা হচ্ছে, $1আনসেট না হওয়ার কারণ রয়েছে ।

হয় আপনার ফাংশন শুরু করার আগে এটি পরীক্ষা করুন, বা ডিফল্ট বিস্তৃতি ব্যবহার করুন ( ইতিমধ্যে অন্য কোনও কিছুতে সেট না ${1-default}করা defaultথাকলে প্রসারিত হবে )।


আমি এটি সন্দেহ করেছিলাম তবে আমি এর আশেপাশের কোনও উপায় ভাবতে পারি না। ডিফল্ট সম্প্রসারণ এটি স্থির করেছে বলে মনে হচ্ছে। আপনাকে অনেক ধন্যবাদ!
তীমথিয় পুলিয়াম

7
বিশেষত, [ -n "${1-}" ]প্যারামিটারটি সেট করা আছে এবং খালি নেই তা দেখার জন্য কেউ (এটি একটি খালি ডিফল্ট মান সহ) ব্যবহার করতে পারে ; অথবা [ "${1+x}" = x ]এটি সেট করা আছে কিনা তা দেখতে, খালি থাকলেও।
ইলকচাছু

আমি তবুও ব্যবহার সত্ত্বেও আনবাউন্ড ভেরিয়েবল ত্রুটি পেয়েছিif [[ -n ${1-default} ]]
চৈতন্য বাপাত

@ চৈতন্যবাপত আমি তার পরিবর্তে unbound variableব্যবহার :-না করা অবধি আমার ততক্ষণে ভাললাগছিল -। সুতরাং, আমার পক্ষে কমপক্ষে, ${1:-default}কোনও একাকী ত্রুটি বাড়িয়ে তুলেনি।
আদম বদুরা

6

এটি এর প্রভাব set -u

আপনি $#ফাংশনটির ভিতরে যাচাই করতে $1পারেন এবং এটি সেট না করা থাকলে রেফারেন্সিং এড়াতে পারেন।

$#আপনি পরামিতি সংখ্যা অ্যাক্সেস করতে পারেন সঙ্গে । বৈশ্বিক প্রসঙ্গে এটি স্ক্রিপ্টের পরামিতিগুলির সংখ্যা, একটি ফাংশনে এটি ফাংশনের পরামিতির সংখ্যা।

প্রশ্নের প্রসঙ্গে, এটি হয়

if [ $# -ge 1 ] && [ -n "$1" ]
then
    df -h $1 | tail -n +2 | awk '{ print $1,"\t",$5 }'
else
    df -h | tail -n +2 | awk '{ print $1,"\t",$5 }'
fi

নোট করুন যে আপনাকে ব্যবহার করতে হবে [ $# -ge 1 ] && [ -n "$1" ]এবং না [ $# -ge 1 -a -n "$1" ], কারণ এটি প্রথমে মূল্যায়ন করবে $1এবং তারপরে চেক করবে $#


কীভাবে $ # ব্যবহার করবেন এবং কীভাবে এটি চেক করবেন তা আপনি আরও ব্যাখ্যা করতে পারেন? ধন্যবাদ
চৈতন্য বাপত

1
আমি একটি উদাহরণ যুক্ত করেছি।
রালফ্রেডল

3

যেহেতু এটি হ'ল bashআপনি $1সেটটি স্থাপনের জন্য চেকটিকে পাশ কাটাতে পারেন এবং কেবল ব্যবহার করতে পারেন "$@"( $1এটি প্রথম প্যারামিটার $@হ'ল এগুলি সমস্তই; ডাবল-কোট করা হয়, এটির কোনও মান না থাকলে এটি সম্পূর্ণ অদৃশ্য হয়ে যায়, যা এটিকে ধরা এড়ানো যায় set -u):

get_percent() {
    df -h "$@" | awk 'NR>1 { printf "%s\t%s\n", $1, $5 }'
}

আমি রেখাটির বাকী অংশটি সামান্য সামান্য ট্যুইক করেছি যাতে আপনি যে দুটি মান আউটপুট করেন তার মধ্যে আপনি "স্পেস}" ট্যাব} {স্পেস don't না পেয়ে থাকেন তবে ইনসেড আপনি কেবল একটি {ট্যাব get পেতে পারেন} আপনি যদি সত্যিই দুটি অদৃশ্য জায়গা চান তবে awkব্যবহারের পরিবর্তন করুন printf "%s \t %s\n", $1, $5


আমি এটি খতিয়ে দেখতে হবে। আমি সেই পরিবর্তনশীল ধরণের সাথে পরিচিত নই। ধন্যবাদ
তীমথিয় পুলিয়াম

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