1. 程式人生 > >shell變數字串常用操作小結

shell變數字串常用操作小結

1、常用的基本操作解析:

①${#string}
//返回$string的長度(字串中的字元個數),${string} | wc -m也可以達到類似的效果
②${string:position}
//返回$string的position開始的字串(提取字串,不含pos)
③${string:position:length}
//返回$string的pos開始的長度為len的字串(不含pos),${string} | cut -c pos1-pos2y可以達到類似效果
④${string#substr}
//返回從變數$string開頭開始不包含$substr的子串
⑤${string%substr}
//返回從變數$string結尾開始不包含最短匹配$substr的子串   
⑥${string/substr/repalace} //返回用replace替換substr之後的string(預設開頭始) ⑦${string/#substr/replace} //返回用replace替換substr之後的string(開頭開始) ⑧${string/%substr/replace} 返回用replace替換substr之後的string(結尾開始) 注意:在以上操作過程中string是沒有發生任何變化的

測試(可以看到program始終是沒變的):

這裡寫圖片描述

2、採用以上操作方式的應用案例:

(1)、用截斷的操作方式批量修改檔名(刪除一部分):
①先產生批量檔案:
生成20個有著相似的檔名的檔案以便於操作:

#!/bin/sh
#script-name:create.sh
for file in `seq -s " " 20`
do
    touch "kangruojin_code_day${file}.c"
done

②批量修改檔名(刪除一部分):

#!/bin/sh
#script-name:delpartname.sh
sh create.sh#先呼叫create.sh指令碼產生操作的檔案
for file in `ls *.c`
do 
#通過mv命令將原來的檔名改為:通過${file#kangruojin_}刪除kangruojin_前半部分的檔名。
    /bin/mv $file
${file#kangruojin_} done

(2)、用替換的操作方式批量修改後綴名:

#!/bin/sh
#change filename suffix from ".c" to ".cpp"
for file in `ls *.c`
do 
#從尾部開始替換,用cpp替換c,然後修改名字
    /bin/mv $file ${file/%c/cpp}
done

對於以上兩種批量操作的測試如下:
這裡寫圖片描述

指令碼的強大之處立即顯現了出來。

3、變數判斷與替換的操作:

①${value:-world}
//如果變數名存在且非NULL,則返回變數的值,否則返回word字串。
②${value:=world}
//如果變數名存在且非NULL,則返回變數的值,否則設定這個變數的值為word並且返回word字串。用途:保證變數存在且不為空。
③${value:? "not defined"}
//如果變數名存在且非NULL,則返回變數的值,否則返回"變數名:not defined" ,並退出當前命令/指令碼。用於捕捉由於變數為定義而導致的錯誤,並且退出程式。
④${value:+world}
//如果變數名存在且非NULL,則返回word,否則返回NULL。

測試如下:
這裡寫圖片描述

4、以上操作方式的應用案例:

由於上面的操作是判斷變數存在與否、是否已經初始化。所以多用在安全操作的判斷中。
如下案例:如果path路徑不存在,為了防止不可預見的錯誤刪除,雖然加了一層邏輯或的關係,但是我們將path不存在時的path初始化為“/tmp/”即會更加安全,並且不會刪除不可預知的東西了:

這裡寫圖片描述

5、效率問題:

最開始我們說,${#string}$string | wc -m 都可以測量長度,但是wc -m(多一個字元是結束標誌)。除了以上兩種方式我們還可以用echo $(expr length "$string") 的方式測字串長度:

這裡寫圖片描述

但是哪一種方式效率高呢?我們用下面這個例子來測試:

/*循環測量10000次並用time測試程式執行時間*/
time for i in `seq 10000`;do cout=${#str};done         
time for i in `seq 10000`;do cout=`echo {str} | wc -m`;done 
time for i in `seq 10000`;do cout=$(expr length "$str");done   

即如果如下:
這裡寫圖片描述
可以發現${#string} 的效率最高,因為${#string} 是內建的,而wc命令是經過C語言寫出的程式,經過一層包裝所以效率最慢。而expr命令也是經過包裝的,效率也差了十多倍(其差別在:wc與expr是浪費在了使用者與核心的互動上,真正用來計算的時間差不了幾倍),所以在指令碼中能使用內建操作的儘量使用,而不要優先去使用現有的命令。

相關推薦

shell變數字串常用操作小結

1、常用的基本操作解析: ①${#string} //返回$string的長度(字串中的字元個數),${string} | wc -m也可以達到類似的效果 ②${string:position} //返回$string的position開始的字串(提取字串

shell指令碼中字串常用操作整理

shell中常用字串操作整理 shell指令碼中常用字串操作如下: 1. 字串的比較 2. 字串的長度 3. 擷取字串 4. 字串的替換 下面分別講解這些操作的用法。 1. 字串的比較 1.1. 等於和不等於 user=zabbix # 這是最常用的 if [

Java字串常用操作

String字串 查詢單引號裡的內容 // String regex = "'([^']*)'"; // 使用懶惰量詞 *? String regex = "'(.*?)'"; Pattern pattern = Pattern.compile(regex); Matcher matche

python3-字串常用操作

1 >>> name = "my name is LiSi" 2 # 首字母大寫 capitalize() 3 >>> name.capitalize() 4 'My name is lisi' 5 6 # 字串全部大寫 upper() 7

Python中字串常用操作

字串常用操作 (1)find 檢測指定字串是否包含在當前字串中,如果是返回開始的索引值,否則返回-1 strs.find(str,start,end) start 為起始位置,end為結束位置 (2)index 作用和find()方法一樣,不過當要查詢的字串不存在時

oracle字串常用操作

oracle操作字串:拼接、替換、擷取、查詢、長度、判斷 1、拼接字串 1)可以使用“||”來拼接字串 select '拼接'||'字串' as str from dual 2)通過concat()函式實現 select co

字串常用函式小結

isalpha() 檢查是否為字母字元 --是的話返回值為非0,不是的話範圍0 isupper() 檢查是否為大寫字母字元 islower() 檢查是否為小寫字母字元 isdigit() 檢查是否為數字        strncpy(p, p1, n)

一文教你學會python讀取文字及字串常用操作

python 讀取txt檔案 開啟支付寶首頁搜尋‘543701491’,領取馬雲的支付寶紅包 Python的文字處理是經常碰到的一個問題,Python的txt檔案讀取中,有三類方法:read()、readline()、readlines(),這三種方法各有利弊,下面逐一介紹其使用方法和利

Python 之字串常用操作

字串表示:str與repr的區別str()函式把值轉換為合理形式的字串,便於理解repr()函式是建立一個字串,以合法的Python表示式形式來表示值。如下: #-*-encoding:utf-8-*- print repr("hello repr") print str("hello str")

Js字串常用操作總結

String型別 String型別是字串的物件包裝型別,可以使用String建構函式來建立 var stringObject = new String("hello world"); 1.字元方法 charAt():以單字元字串的形式返回給定位置

go語言中字串常用操作

導語 在工作中遇到了go語言,個人趕腳入門還是很快的,作為一個新手,這裡記錄自己遇到go語言中字串的用法。 基本知識簡介 型別為string 字串用 “” ,或者 ” 括起來定義 字串不可變 例如下面的例子會報錯: var s st

Shell判斷字串是否包含小結

前言現在每次分析網站日誌的時候都需要判斷百度蜘蛛是不是真實的蜘蛛,nslookup之後需要判斷結果中是否包含“baidu”字串以下給出一些shell中判斷字串包含的方法,來源程式設計師問答網站 stackoverflow 以及segmentfault。方法一:利用grep查詢

java字串常用操作(查詢、擷取、分割)

public class 字串常用操作 { public static void main(String[] args) { /* * 查詢子串

(四)Python學習之字串常用操作(下)

(四)Python學習之字串常用操作(下) 七.其他常用操作 1.format(*args,**kwargs): 格式化字串,將一個字串中的佔位符替換為指定的值;format 函式可以接受不限個引數,位置可以不按順序; print("網站名:{name}, 地址 {url}".for

(三)Python學習之字串常用操作(上)

(三)Python學習之字串常用操作(上) 一、字母處理 upper(): 全部大寫; lower(): 全部小寫; swapcase(): 大小寫互換; capitalize(): 首字母大寫,其餘小寫; title(): 首字母大寫(轉換為標題);

字串常用操作的實現

// myString.cpp 串採用定長順序儲存結構的基本操作(14個) // SString是陣列,故不需引用型別。 // 串的定長順序儲存表示 #include <iostream> #define MAXSTRLEN 40 // 使用者可在255以內定義

Java 字串常用操作(String類)

字串查詢 indexOf(String s) 該方法用於返回引數字串s在指定字串中首次出現的索引位置,當呼叫字串的indexOf()方法時,會從當前字串的開始位置搜尋s的位置;如果沒有檢索到字串s,該方法返回-1 String str ="

字串常用操作

字元型別:   一.包括:         C:字元         N:應該算是字元型的數字         D:日期型別,標準長度8(YYYYMMDD),注意其初期值的判斷,不是space,而是'00000000',判斷語句可以使用is initial or not。

Shell處理字串常用方法

一、構造字串 直接構造 STR_ZERO=hello STR_FIRST="i am a string" STR_SECOND='success' 重複多次 #repeat the first parm($1) by $2 times strRepeat() { local x=$2 if [ "$x" ==

Postgresql ALTER語句常用操作小結

postgresql版本:psql (9.3.4)1、增加一列複製程式碼程式碼如下:ALTER TABLE table_name ADD column_name datatype;             2、刪除一列複製程式碼程式碼如下:ALTER TABLE table_