1. 程式人生 > >Shell_Linux Shell 中實現字串切割的幾種方法

Shell_Linux Shell 中實現字串切割的幾種方法

我們在shell 指令碼程式設計中,經常需要用到字串切割,即將字串切割為一個數組,類似java 中的split 函式,下面對幾種常見的方式做一個總結。

參考文章:

shell 使用指定的分割符來分割字串

目錄

方法一: 利用shell 中 變數 的字串替換   

方法二: 設定分隔符,通過 IFS 變數

方法三: 利用tr 指令實現字元替換  (!只能針對單個分隔符)


方法一: 利用shell 中 變數 的字串替換

原理:

${parameter//pattern/string}

用string來替換parameter變數中所有匹配的pattern

示例:

#!/bin/bash

string="hello,shell,split,test"  
array=(${string//,/ })  

for var in ${array[@]}
do
   echo $var
done 

方法二: 設定分隔符,通過 IFS 變數

原理

自定義IFS變數, 改變分隔符, 對字串進行切分

參考文章:

一、IFS 介紹

     Shell 指令碼中有個變數叫 IFS(Internal Field Seprator) ,內部域分隔符。完整定義是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

     Shell 的環境變數分為 set, env 兩種,其中 set 變數可以通過 export 工具匯入到 env 變數中。其中,set 是顯示設定shell變數,僅在本 shell 中有效;env 是顯示設定使用者環境變數 ,僅在當前會話中有效。換句話說,set 變數裡包含了 env 變數,但 set 變數不一定都是 env 變數。這兩種變數不同之處在於變數的作用域不同。顯然,env 變數的作用域要大些,它可以在 subshell 中使用。

     而 IFS 是一種 set 變數,當 shell 處理"命令替換"和"引數替換"時,shell 根據 IFS 的值,預設是 space, tab, newline 來拆解讀入的變數,然後對特殊字元進行處理,最後重新組合賦值給該變數。

二、IFS 簡單例項

1、檢視變數 IFS 的值。

$ echo $IFS  
  
$ echo "$IFS" | od -b  
0000000 040 011 012 012  
0000004  
直接輸出IFS是看不到的,把它轉化為二進位制就可以看到了,"040"是空格,"011"是Tab,"012"是換行符"\n" 。最後一個 012 是因為 echo 預設是會換行的。

示例

#!/bin/bash

string="hello,shell,split,test"  

#對IFS變數 進行替換處理
OLD_IFS="$IFS"
IFS=","
array=($string)
IFS="$OLD_IFS"

for var in ${array[@]}
do
   echo $var
done

執行結果


方法三: 利用tr 指令實現字元替換

原理

由於只是對單個字元進行的替換,則可以用  echo args |   tr "oldSpilt" "newSpilt"  的方式實現。

tr 指令講解

背景介紹

tr命令可以對來自標準輸入的字元進行替換、壓縮和刪除。它可以將一組字元變成另一組字元,經常用來編寫優美的單行命令,作用很強大。

語法
tr(選項)(引數)
選項
  -c或——complerment:取代所有不屬於第一字符集的字元;
  -d或——delete:刪除所有屬於第一字符集的字元;
  -s或--squeeze-repeats:把連續重複的字元以單獨一個字元表示;
  -t或--truncate-set1:先刪除第一字符集較第二字符集多出的字元。
引數
  字符集1:指定要轉換或刪除的原字符集。當執行轉換操作時,必須使用引數“字符集2”指定轉換的目標字符集。但執行刪除操作時,不需要引數“字符集2”;
  字符集2:指定要轉換成的目標字符集。

示例:

#!/bin/bash

string="hello,shell,split,test"  
array=(`echo $string | tr ',' ' '` )  

for var in ${array[@]}
do
   echo $var
done 


shell 使用指定的分割符來分割字串