W tym temacie zdefiniowaliśmy sposób podziału ciągu znaków w skrypcie powłoki bash.
W niektórych przypadkach może być konieczne podzielenie danych ciągu w celu wykonania określonych zadań. Większość języków programowania zawiera wbudowaną funkcję „split”, która pozwala podzielić dowolny ciąg danych na wiele części. Jednak bash nie zawiera wbudowanej funkcji tego typu. Ale możemy użyć ograniczników, aby podzielić dowolne dane łańcuchowe w skrypcie bash. Separatorem może być pojedynczy znak lub ciąg składający się z wielu znaków.
Sprawdź poniższe metody, aby zrozumieć, jak podzielić ciąg znaków w powłoce bash:
Podziel przy użyciu zmiennej $IFS
Poniżej przedstawiono kroki podziału ciągu w bashu za pomocą $IFS:
- $IFS to specjalna zmienna wewnętrzna, która służy do dzielenia ciągu znaków na słowa. Zmienna $IFS nazywa się „ Wewnętrzny separator pól ', który określa, w jaki sposób Bash rozpoznaje granice. $IFS służy do przypisania określonego ogranicznika [ IFS='' ] do dzielenia ciągu. Biała spacja jest wartością domyślną $IFS. Jednakże możemy również użyć wartości takich jak „ ”, „ ”, „-” itp. jako ograniczników.
- Po przypisaniu ogranicznika ciąg można odczytać za pomocą dwóch opcji: '-r' i '-a'. tj., czytaj -ra ARR <<< '$str' .
W tym przypadku opcja „-r” służy do zdefiniowania, że ukośnik odwrotny () jest znakiem, a nie znakiem zmiany znaczenia. Opcja „-a” służy do zdefiniowania, że słowa (oddzielone przez $IFS) są przypisane do indeksu sekwencyjnego tablicy zaczynającego się od zera. - Następnie stosujemy pętlę bash „for”, aby uzyskać dostęp do tokenów podzielonych na tablicę.
Przyjrzyjmy się temu mechanizmowi na kilku przykładach:
Przykład 1: Bash dzieli ciąg znaków według spacji
W tym przykładzie ciąg znaków jest dzielony przy użyciu znaku spacji.
Skrypt Basha
#!/bin/bash #Example for bash split string by space read -p 'Enter any string separated by space: ' str #reading string value IFS='' #setting space as delimiter read -ra ADDR <<<'$str' #reading str as an array tokens separated by ifs for i in '${addr[@]}'; #accessing each element of do echo '$i' done < pre> <p> <strong>Output</strong> </p> <p>If we input a string 'We welcome you on Javatpoint', the output will look like this:</p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string.webp" alt="Bash Split String"> <h3>Example 2: Bash Split String by Symbol</h3> <p>In some cases, we may have a requirement to split a string by other delimiters such as a symbol or specific character. In this example, a string is split using a comma (,) symbol character as a delimiter.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string by Symbol (comma) read -p 'Enter Name, State and Age separated by a comma: ' entry #reading string value IFS=',' #setting comma as delimiter read -a strarr <<<'$entry' #reading str as an array tokens separated by ifs echo 'name : ${strarr[0]} ' 'state ${strarr[1]} 'age ${strarr[2]}' < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-2.webp" alt="Bash Split String"> <h2>Split without $IFS variable</h2> <p>In bash, a string can also be divided without using $IFS variable. The 'readarray' command with -d option is used to split the string data. The -d option is applied to define the separator character in the command like $IFS. Moreover, the bash loop is used to print the string in split form.</p> <p>Let's understand this logic with the help of some example:</p> <h3>Example 1: Bash Split String by Symbol</h3> <p>This example defines how a string value can be split without using $IFS. As per the script, a text value should be entered with the colon (:) sign so that it can be split. Check out the bash script below:</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string without $IFS read -p 'Enter any string separated by colon(:) ' str #reading string value readarray -d : -t strarr <<<'$str' #split a string based on the delimiter ':' printf ' ' #print each value of array with help loop for (( n="0;" < ${#strarr[*]}; n++ )) do echo '${strarr[n]}' done pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-3.webp" alt="Bash Split String"> <h3>Example 2: Bash Split String by another string</h3> <p>In this example, we have used idiomatic expressions where parameter expansion has completed.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example for bash split string by another string str='WeLearnWelcomeLearnYouLearnOnLearnJavatpoint' delimiter=Learn s=$str$delimiter array=(); while [[ $s ]]; do array+=( '${s%%'$delimiter'*}' ); s=${s#*'$delimiter'}; done; declare -p array </pre> <p>In this bash script, we have used the following Parameter- Expansions:</p> <ul> <tr><td>${parameter%%word}</td> <br> It removes the longest matching suffix pattern. </tr><tr><td>${parameter#word}</td> <br> It removes the shortest matching prefix pattern. </tr></ul> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-4.webp" alt="Bash Split String"> <h3>Example 3: Bash Split String using Trim Command</h3> <p>In this example, we have used trim (tr) command to split a string. Instead of using the read command, the trim command is used to split a string on the delimiter.</p> <p> <strong>Bash Script</strong> </p> <pre> #!/bin/bash #Example to split a string using trim (tr) command my_str='We;welcome;you;on;javatpoint.' my_arr=($(echo $my_str | tr ';'' ')) for i in '${my_arr[@]}' do echo $i done </pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/bash-tutorial/11/bash-split-string-5.webp" alt="Bash Split String"> <h4>Note: It should be noted that array elements are divided on 'space delimiter' if we apply a trim command to split a string. For example, elements like 'Windows OS' will be treated as two different words.</h4> <h2>Conclusion</h2> <p>In this topic, we demonstrated how to split a string in bash scripting with different types of scenarios with or without using delimiter.</p> <hr></'$str'></pre></'$entry'></pre></'$str'>
W tym skrypcie basha użyliśmy następujących rozszerzeń parametrów:
Usuwa najdłuższy pasujący wzór sufiksu.
Usuwa najkrótszy pasujący wzorzec prefiksu.
Wyjście
Przykład 3: Bash Split String za pomocą polecenia Trim
W tym przykładzie użyliśmy polecenia trim (tr) do podziału łańcucha. Zamiast używać polecenia read, polecenie trim służy do podziału ciągu znaków na ograniczniku.
Skrypt Basha
#!/bin/bash #Example to split a string using trim (tr) command my_str='We;welcome;you;on;javatpoint.' my_arr=($(echo $my_str | tr ';'' ')) for i in '${my_arr[@]}' do echo $i done
Wyjście
Uwaga: Należy zauważyć, że elementy tablicy są dzielone według „separatora spacji”, jeśli zastosujemy polecenie przycinania w celu podzielenia ciągu. Na przykład elementy takie jak „system operacyjny Windows” będą traktowane jako dwa różne słowa.
Wniosek
W tym temacie zademonstrowaliśmy, jak podzielić ciąg znaków w skrypcie bash przy użyciu różnych typów scenariuszy, z użyciem ogranicznika lub bez niego.
\'$str\'>\'$entry\'>'$str'>