BATsh चीटशीट [HI] हिन्दी
========================

----------------------------------------------------------------------
सारांश
  BATsh एक द्विभाषी शेल है जो cmd.exe बैच और bash/sh वाक्यविन्यास को एक ही
  स्क्रिप्ट फ़ाइल में चलाता है। यह प्रति पंक्ति/अनुभाग स्वतः मोड बदलता है।
  किसी बाहरी शेल की आवश्यकता नहीं -- शुद्ध Perl कार्यान्वयन।
  पाइपलाइन, पुनर्निर्देशन, फलन और चर-विस्तार एक्सटेंशन का समर्थन करता है।

मिश्रित-मोड नमूना
  :: CMD अनुभाग (पहला टोकन बड़े अक्षर में)
  @ECHO OFF
  SET LANG=BATsh
  SET COUNT=3

  # SH अनुभाग (पहला टोकन छोटे अक्षर में)
  greet() { echo "Hello from $1 (bash mode)"; }
  greet $LANG
  for i in 1 2 3; do echo "  item $i of $COUNT"; done
  result=$(echo $LANG | perl -ne "print uc")
  echo "Uppercase: $result"

  :: फिर से CMD अनुभाग (ब्रिज के माध्यम से SH का परिणाम पढ़ता है)
  ECHO Back in CMD: %result%

  # इससे चलाएँ: perl lib/BATsh.pm script.batsh
  # या:         use BATsh; BATsh->run('script.batsh');
----------------------------------------------------------------------


BATsh एक द्विभाषी शेल है जो cmd.exe और bash/sh वाक्यविन्यास को एक ही
स्क्रिप्ट में चलाता है।  स्क्रिप्ट को अनुभागों में बाँटा जाता है; प्रत्येक
अनुभाग को उपयुक्त शेल द्वारा यथावत निष्पादित किया जाता है।

1. मोड पहचान
------------
  किसी अनुभाग की पहली सार्थक पंक्ति का «पहला टोकन» यह निर्धारित करता है कि
  उस अनुभाग को कौन-सा शेल निष्पादित करेगा:

  CMD मोड: पहला टोकन पूर्णतः [A-Z 0-9 _ - \ / : . @ %] से बना हो और
           उसमें कम-से-कम एक बड़ा अक्षर A-Z हो।

    ECHO hello          -> CMD अनुभाग (cmd.exe)
    SET FOO=bar baz     -> CMD अनुभाग  (मान वाले भाग की जाँच नहीं होती)
    @ECHO OFF           -> CMD अनुभाग
    IF "%X%"=="Y" (     -> CMD अनुभाग

  SH मोड: अन्य सब कुछ (कोई छोटा अक्षर हो, या कोई अक्षर ही न हो)।

    echo hello          -> SH अनुभाग  (bash/sh)
    export FOO=bar      -> SH अनुभाग
    if [ -f "$f" ]; then  -> SH अनुभाग
    #!/bin/sh           -> SH अनुभाग  (shebang एक SH पंक्ति है)

  टिप्पणियाँ और रिक्त पंक्तियाँ वर्तमान अनुभाग में समाहित कर ली जाती हैं।
  टिप्पणी वाक्यविन्यास:
    ::           CMD-शैली टिप्पणी
    REM ...      CMD-शैली टिप्पणी (बड़े-छोटे अक्षर से निरपेक्ष)
    @REM ...     CMD-शैली टिप्पणी
    # ...        SH-शैली टिप्पणी  (#! shebang नहीं)

2. शेल आरंभ करना
----------------
  perl lib/BATsh.pm               # इंटरैक्टिव REPL
  perl lib/BATsh.pm script.batsh  # एक स्क्रिप्ट फ़ाइल चलाएँ
  perl lib/BATsh.pm -e "echo hi"  # इनलाइन एक-पंक्ति कमांड

  Perl से:
    use BATsh;
    BATsh->run('script.batsh');
    BATsh->run_string("echo hello");
    BATsh->repl();

3. पर्यावरण चर ब्रिज
--------------------
  प्रत्येक अनुभाग चलने से पहले, BATsh वर्तमान %ENV को प्रस्तावना के रूप में
  सम्मिलित करता है (CMD के लिए SET पंक्तियाँ, SH के लिए export पंक्तियाँ)।
  अनुभाग के बाद, शेल का अंतिम पर्यावरण %ENV में पुनः पढ़ लिया जाता है।

  export FOO=hello   # SH, FOO सेट करता है
  ECHO %FOO%         # CMD, FOO को ब्रिज से पढ़ता है (Windows)

  SET BAR=world      # CMD, BAR सेट करता है
  echo $BAR          # SH, BAR को ब्रिज से पढ़ता है

4. SETLOCAL / ENDLOCAL
----------------------
  SETLOCAL           # %ENV का स्नैपशॉट (cmd.exe नहीं, BATsh द्वारा प्रबंधित)
  SET TMP=local_val
  ECHO %TMP%
  ENDLOCAL           # %ENV पुनर्स्थापित (TMP समाप्त)

  कार्यक्षेत्र नेस्टेड हो सकते हैं।

5. अनुभाग सीमा पहचान
--------------------
  कोई अनुभाग तब समाप्त होता है जब उसके ब्लॉक की गहराई शून्य पर लौटे और अगली
  सार्थक पंक्ति किसी भिन्न मोड की हो।

  CMD अनुभाग उद्धरण के बाहर के ( और ) की गहराई का अनुसरण करते हैं:

    IF "%X%"=="Y" (     <- ब्लॉक खोलता है (गहराई 1)
        ECHO yes
    ) ELSE (            <- बंद कर फिर खोलता है (गहराई >=1 बनी रहती है)
        ECHO no
    )                   <- ब्लॉक बंद (गहराई 0) -> अनुभाग समाप्त हो सकता है

  SH अनुभाग कीवर्ड की गहराई का अनुसरण करते हैं:

    for x in 1 2; do   <- ब्लॉक खोलता है (गहराई 1)
        echo $x
    done                <- ब्लॉक बंद (गहराई 0) -> अनुभाग समाप्त हो सकता है

  किसी खुले ब्लॉक के भीतर की पंक्तियाँ वर्तमान अनुभाग में समाहित की जाती हैं,
  भले ही उनका पहला टोकन दूसरे मोड जैसा दिखे। इससे यह संभव होता है:

    for x in A B; do
        ECHO $x          <- SH ब्लॉक के भीतर बड़े अक्षर: फिर भी SH अनुभाग
    done

  SH कीवर्ड युग्म:
    खोलने वाले (+1) : if  for  while  until  case  function  select  {
    बंद करने वाले (-1) : fi  done  esac  }
    तटस्थ      ( 0) : then  do  else  elif

6. सबरूटीन परिभाषाएँ
--------------------
  :GREET
  echo "Hello $BATSH_ARG1"
  RET

  लेबल : से आरंभ होते हैं और RET या RETURN पर समाप्त होते हैं।
  मुख्य भाग निष्पादन से पहले निकाला जाता है (इनलाइन नहीं चलता)।
  मुख्य भाग में CMD पंक्तियाँ, SH पंक्तियाँ, या मिश्रण हो सकते हैं।

7. CALL और source
-----------------
  CALL :GREET world      # तर्क के साथ सबरूटीन को कॉल करें
  CALL other.batsh       # दूसरी .batsh फ़ाइल सम्मिलित/चलाएँ (CMD)
  source other.batsh     # दूसरी .batsh फ़ाइल सम्मिलित/चलाएँ (SH)
  . other.batsh          # POSIX डॉट संकेतन

  तर्क: $BATSH_ARG1 .. $BATSH_ARGn  (CMD में %BATSH_ARG1%)
  संख्या: $BATSH_ARGC

8. Perl API
-----------
  BATsh->run($file)            # .batsh फ़ाइल चलाएँ
  BATsh->run_string($source)   # स्रोत स्ट्रिंग चलाएँ
  BATsh->run_lines(@lines)     # पंक्तियों की सरणी चलाएँ
  BATsh->repl()                # इंटरैक्टिव REPL
  BATsh->classify_token($tok)  # 'CMD' या 'SH'
  BATsh->setlocal()            # %ENV का स्नैपशॉट
  BATsh->endlocal()            # %ENV पुनर्स्थापित
  BATsh->call_sub($lbl, @args) # सबरूटीन कॉल करें
  BATsh->source_file($file)    # .batsh फ़ाइल सम्मिलित करें
  BATsh->version()             # संस्करण स्ट्रिंग

9. प्लेटफ़ॉर्म टिप्पणियाँ
------------------------
  Windows: CMD और SH दोनों अनुभाग शुद्ध Perl में चलते हैं -- किसी बाहरी cmd.exe, bash, या sh की आवश्यकता नहीं।
  UNIX:    CMD और SH दोनों अनुभाग शुद्ध Perl में चलते हैं -- किसी बाहरी cmd.exe, bash, या sh की आवश्यकता नहीं।

10. आवश्यकताएँ
--------------
  Perl 5.005_03 या नया।  केवल कोर मॉड्यूल (File::Spec, Carp)।
  कोई CPAN निर्भरता नहीं।

11. CMD पाइपलाइन और पैरामीटर संशोधक
-----------------------------------
  cmd1 | cmd2              # अस्थायी फ़ाइल के माध्यम से पाइपलाइन (शुद्ध Perl)
  ECHO hello | perl -e "while(<STDIN>){print uc}"

  SET /P VAR=Prompt:       # STDIN से एक पंक्ति पढ़कर VAR में रखें

  बैच-पैरामीटर टिल्ड संशोधक (उदा. जब %0=C:\scripts\deploy.bat हो):
    %~0   -> C:\scripts\deploy.bat  (केवल उद्धरण हटाना)
    %~f0  -> C:/scripts/deploy.bat  (पूर्ण निरपेक्ष पथ)
    %~d0  -> C:                     (ड्राइव अक्षर)
    %~p0  -> /scripts/              (निर्देशिका पथ)
    %~n0  -> deploy                 (विस्तार रहित फ़ाइल नाम)
    %~x0  -> .bat                   (विस्तार)
    %~dp0 -> C:/scripts/            (ड्राइव + निर्देशिका, सबसे सामान्य)
    %~nx1 -> deploy.bat             (नाम + विस्तार)

12. SH फलन और विस्तार
---------------------
  greet() {              # फलन परिभाषा
      echo "Hi $1"
  }
  function add {         # वैकल्पिक वाक्यविन्यास
      echo $(( $1 + $2 ))
  }
  greet world            # फलन कॉल करें
  add 3 4                # -> 7

  ${var%.*}    .* से मेल खाता सबसे छोटा प्रत्यय हटाएँ
  ${var%%.*}   .* से मेल खाता सबसे लंबा  प्रत्यय हटाएँ
  ${var#*.}    *. से मेल खाता सबसे छोटा उपसर्ग हटाएँ
  ${var##*.}   *. से मेल खाता सबसे लंबा  उपसर्ग हटाएँ
  ${var/a/b}   a की पहली उपस्थिति को b से बदलें
  ${var//a/b}  a की सभी उपस्थितियों को b से बदलें
  ${var^^}     सब बड़े अक्षर
  ${var,,}     सब छोटे अक्षर
  ${var:2:4}   ऑफ़सेट 2 से लंबाई 4 की उपस्ट्रिंग
  ${#var}      स्ट्रिंग की लंबाई
  ${var:-def}  सेट हो तो मान, अन्यथा def

13. SH I/O पुनर्निर्देशन
------------------------
  cmd > file      stdout अधिलेखित करें
  cmd >> file     stdout में जोड़ें
  cmd < file      फ़ाइल से stdin
  cmd 2> file     stderr फ़ाइल में
  cmd 2>&1        stderr को stdout में मिलाएँ
  cmd > f 2>&1    stdout और stderr दोनों फ़ाइल में

  Here-document (stdin पर इनपुट):
    cmd <<EOF       EOF तक मुख्य पंक्तियाँ; $VAR विस्तारित होता है
    cmd <<'EOF'     EOF तक मुख्य पंक्तियाँ; कोई विस्तार नहीं (शाब्दिक)
    cmd <<-EOF      <<EOF जैसा, पर पंक्ति-आरंभ के TAB वर्ण हटा दिए जाते हैं

14. SH संयुक्त कमांड
--------------------
  cmd1 && cmd2    cmd2 तभी चलाएँ जब cmd1 सफल हो
  cmd1 || cmd2    cmd2 तभी चलाएँ जब cmd1 विफल हो
  cmd1 ; cmd2     cmd2 बिना शर्त चलाएँ

यह भी देखें: https://metacpan.org/dist/BATsh
