इसलिए मैं स्क्रिप्टिंग को बैश करने के लिए काफी नया हूं और मुझे अपनी समस्या का समाधान निकालने में समस्या हो रही है।

इसलिए मैं "ShiftCodeAssociations.txt" में तीन नंबर लिखना चाहता हूं और फिर सामग्री इस तरह दिखती है:

1
2
3

हालांकि, हर बार जब मैं इस स्क्रिप्ट को चलाता हूं तो मैं चाहता हूं कि यह संख्याओं को स्थानांतरित कर दे ताकि यह संख्या को ऊपर से नीचे की ओर रखे।

लूप्स रीडिंग लाइन बाय लाइन देखने के बाद मुझे यह https://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/ और निम्नलिखित के साथ आया

#!/bin/bash
input="/home/ubuntu/ShiftCodeAssociations.txt"
while IFS= read -r line
do
  if [$line = "1"]
  then
        $line = "2"
  elif [$line = "2"]
  then
        $line = "3"
  else
        $line = "1"
  fi
done < $input

हालाँकि, यह काम नहीं करता है और यह आउटपुट करता है

AdjustShiftCodes.sh: 5: AdjustShiftCodes.sh: [1: not found
AdjustShiftCodes.sh: 8: AdjustShiftCodes.sh: [1: not found
AdjustShiftCodes.sh: 12: AdjustShiftCodes.sh: 1: not found
AdjustShiftCodes.sh: 5: AdjustShiftCodes.sh: [2: not found
AdjustShiftCodes.sh: 8: AdjustShiftCodes.sh: [2: not found
AdjustShiftCodes.sh: 12: AdjustShiftCodes.sh: 2: not found
AdjustShiftCodes.sh: 5: AdjustShiftCodes.sh: [3: not found
AdjustShiftCodes.sh: 8: AdjustShiftCodes.sh: [3: not found
AdjustShiftCodes.sh: 12: AdjustShiftCodes.sh: 3: not found

कृपया क्या कोई मेरी मदद कर सकता है :)

शुक्रिया!

0
Brett53559 5 नवम्बर 2020, 00:11

2 जवाब

सबसे बढ़िया उत्तर

एसईडी

sed -i '1{h; d}; $G' ShiftCodeAssociations.txt

जीएनयू awk

gawk -i inplace 'NR == 1 {first = $0; next} 1; END {print first >> FILENAME}' ShiftCodeAssociations.txt

दे घुमा के

f="ShiftCodeAssociations.txt"
mapfile -t lines < "$f"
lines+=("${lines[0]}")
unset 'lines[0]'
printf '%s\n' "${lines[@]}" > "$f"

# The rotation can also be done like this:
#    lines=( "${lines[@]:1}" "${lines[0]}" )

या

f="ShiftCodeAssociations.txt"
temp=$(mktemp)
while IFS= read -r num; do
    echo "$(( num % 3 + 1 ))"
done < "$f" > "$temp" && mv "$temp" "$f"
1
glenn jackman 5 नवम्बर 2020, 00:32

BTW, यह स्क्रिप्ट क्या कर रही है यह वास्तव में स्पष्ट नहीं है: जैसा कि यह कुछ भी आउटपुट नहीं करेगा। if स्टेटमेंट के भीतर आप केवल स्ट्रिंग्स "1", "2" और "3" को वेरिएबल $line में असाइन कर रहे हैं (फ़ाइल की लाइन के अनुरूप प्रारंभिक मान को प्रतिस्थापित करना)।

आप कमांड echo का उपयोग करके देख सकते हैं और मान को किसी फ़ाइल में रीडायरेक्ट कर सकते हैं।

सही सिंटैक्स के साथ स्क्रिप्ट का अनुसरण करना।

#!/bin/bash
input="/home/ubuntu/ShiftCodeAssociations.txt"
while IFS= read -r line
do
  if [[ "$line" == "1" ]]; then
        line="2"
  elif [[ "$line" == "2" ]]; then
        line="3"
  else
        line="1"
  fi
done < $input

बैश थोड़ा अजीब है क्योंकि "रिक्त स्थान" अन्य परिष्कृत भाषाओं की तुलना में थोड़ा अलग व्यवहार करता है। उदाहरण के लिए, एक चर निर्दिष्ट करते समय फॉर्म $line = "1" काम नहीं करता है क्योंकि $line को प्रक्षेपित किया जाएगा और एक कमांड के रूप में माना जाएगा (इसके बाद एक स्थान है)।

0
Riccardo Petraglia 5 नवम्बर 2020, 00:24