← Back to Bash Course | Chapter 2: Variables & Types | Lesson 8 of 13

readonly और unset

readonly एक variable को इस तरह lock करता है कि इसे फिर कभी change न किया जा सके, और unset एक variable को पूरी तरह हटा देता है जैसे इसे कभी assign ही नहीं किया गया था।
Syntax
bash
readonly CONSTANT_NAME=value
unset variable_name

readonly से एक Constant Declare करना

readonly NAME=value एक step में एक variable बनाता है और इसे immutable mark करता है, इसलिए इसे बाद में reassign करने की कोई भी कोशिश value को silently change करने के बजाय एक error message के साथ fail होती है।

यह उन values के लिए useful है जो आपकी script में असली constants represent करती हैं, जैसे एक fixed configuration path।

उदाहरण: Declaring a Constant with readonly

bash
#!/bin/bash
readonly MAX_RETRIES=3
echo "Max retries allowed: $MAX_RETRIES"

एक readonly Variable को Change करने की कोशिश करना

अगर आप एक readonly variable को reassign करने की कोशिश करें, Bash stderr पर एक error print करता है और assignment refuse करता है, लेकिन default रूप से script इसके बाद भी run होती रहती है (यह automatically halt नहीं होती)।

कोशिश को इस तरह wrap करना कि script failure पर react कर सके इसे gracefully handle करने देता है।

उदाहरण: Attempting to Change a readonly Variable

bash
#!/bin/bash
readonly LOCKED="original"
if ! (LOCKED="changed") 2>/dev/null; then
    echo "As expected, LOCKED could not be reassigned"
fi
echo "LOCKED is still: $LOCKED"

unset से एक Variable हटाना

unset NAME एक variable की definition को पूरी तरह delete कर देता है, इसलिए बाद में इसे refer करना वैसे behave करता है जैसे इसे कभी assign नहीं किया गया था (एक empty string में expand होना, या set -u के under एक error trigger करना)।

यह एक empty string assign करने से अलग है, जो variable को defined लेकिन empty रखता है।

उदाहरण: Removing a Variable with unset

bash
#!/bin/bash
temp_value="scratch data"
echo "Before unset: [$temp_value]"
unset temp_value
echo "After unset: [$temp_value]"
if [ -z "${temp_value+set}" ]; then
    echo "temp_value is completely unset"
fi

Empty String बनाम Truly Unset

${var+set} literal word set में expand होता है अगर var बिल्कुल भी defined हो (empty string के रूप में भी), और कुछ नहीं में अगर यह पूरी तरह unset हो।

यह parameter expansion दो states के बीच बताने का standard तरीका है, जो value पर एक plain -z check नहीं कर सकता।

उदाहरण: Empty String vs Truly Unset

bash
#!/bin/bash
empty_var=""
unset gone_var
echo "empty_var defined? ${empty_var+yes}"
echo "gone_var defined? ${gone_var+yes}"
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. एक readonly variable को change या unset करने की कोशिश करना और इसके silently काम करने की उम्मीद करना; Bash refuse करता है और एक error print करता है, और एक non-interactive script में यह settings के आधार पर script को exit भी कर सकता है।
  2. unset var को एक variable को empty string, var="", set करने के साथ confuse करना; एक empty-string variable अब भी set (defined) है और एक पूरी तरह unset वाले से अलग तरीके से -v या ${var+x} tests pass करता है।
  3. यह मान लेना कि readonly सिर्फ = के through reassignment रोकता है; यह उस same shell के अंदर उस same variable पर unset को भी block करता है।
चैप्टर सारांश
  • readonly NAME=value shell की बची life के लिए एक variable की value immutable बना देता है; इसे reassign करने की कोशिश एक error produce करती है।
  • unset NAME एक variable की definition को पूरी तरह हटा देता है, इसे empty string में set करने से अलग।
  • एक readonly variable को उसी shell session में बाद में unset नहीं किया जा सकता।
  • दोनों defensive scripting के लिए useful हैं: readonly constants को protect करता है, unset temporary variables साफ़ करता है या एक fresh state ensure करता है।

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.