Shell 字符串操作符實例

字符串操作符

表達式 含義
${parameter-word} parameter變量未聲明,取默認值 word
${parameter:-word} parameter變量未聲明或值爲空時,取默認值 word
${parameter=word} parameter變量未聲明,則取默認值 word
${parameter:=word} parameter變量未聲明或值爲空時,取默認值 word
${parameter+word} parameter變量未聲明, 取值爲空,否則取值爲 word
${parameter:+word} parameter變量聲明, 取值爲 word,否則取值爲空
${parameter?word} parameter變量未聲明, 標準錯誤輸出 word且退出 shell
${parameter:?word} parameter取值爲空, 標準錯誤輸出 word且退出 shell
${!prefix*} 匹配所有以 prefix開頭且聲明的變量
${!prefix@} 匹配所有以 prefix開頭且聲明的變量
${#parameter} $parameter的長度
${parameter:offset} 從左邊指定位置 offset開始,截取後面所有字符串
${parameter:offset:length} 從左邊指定位置offset開始,截取指定長度length字符串
${parameter#pattern} 從右邊開始,刪除最短匹配pattern的子字符串
${parameter##pattern} 從右邊開始,刪除最長匹配pattern的子字符串
${parameter%pattern} 從左邊開始,刪除最短匹配pattern的子字符串
${parameter%%pattern} 從左邊開始,刪除最長匹配pattern的子字符串
${parameter/pattern/string} 從右邊開始,替換第一次出現匹配項 patternstring
${parameter//pattern/string} 替換所有匹配項 patternstring
${parameter/#pattern/string} 替換開頭匹配pattern字符串爲 string
${parameter/%pattern/string} 替換結尾匹配pattern字符串爲 string
${parameter^pattern} 開頭第一個小寫字母轉換爲大寫
${parameter^^pattern} 所有小寫字母轉換爲大寫
${parameter,pattern} 開頭第一個大寫字母轉換爲小寫
${parameter,,pattern} 所有大寫字母轉換爲小寫

實例腳本

可以使用 sh -v testString.sh命令來執行如下腳本,查看原始命令及輸出內容,爲了方便區分命令和內容,其中輸出內容以深藍色顯示。

# 實例腳本
$ cat testString.sh
#!/bin/bash
# 字符串操作符實例

# 判斷操作系統,解決 mac下 echo 不支持“-e”參數問題
if [[ "$(uname)" != "Darwin" ]];then
    ee="-e"
fi

# var 變量未聲明
echo ${ee} "\033[36mvar 變量未聲明,輸出爲空: ${var}\033[0m"

# 變量未聲明,取默認值
echo ${ee} "\033[36mvar 變量未聲明,則取默認值:${var-daodaotest}\033[0m"
echo ${ee} "\033[36mvar 變量未聲明,則取默認值:${var=daodaotest}\033[0m"

# 變量未聲明或取值爲空時,取默認值
# 變量未聲明,取默認值
echo ${ee} "\033[36mvar2 變量未聲明,則取默認值:${var2:-daodaotest2}\033[0m"
echo ${ee} "\033[36mvar2 變量未聲明,則取默認值:${var2:=daodaotest2}\033[0m"

# 取值爲空時
var3=
echo ${ee} "\033[36mvar3 變量聲明,但值爲空時,取默認值:${var3:-daodaotest3}\033[0m"
echo ${ee} "\033[36mvar3 變量聲明,但值爲空時,取默認值:${var3:=daodaotest3}\033[0m"

# 變量未聲明,值爲空;聲明瞭爲設置值
echo ${ee} "\033[36mvar4 變量未聲明,值爲空:${var4+daodaotest4}\033[0m"
var5=daodaotest5
echo ${ee} "\033[36mvar5 變量聲明,取設置值:${var5+daodaotest}\033[0m"

# 變量未聲明或取值爲空時,打印設置信息且程序退出
var6=daodaotest6
echo ${ee} "\033[36mvar6 變量聲明且取值,不打印設置信息:${var6?變量未聲明或取值爲空}\033[0m"

# 變量未聲明或取值爲空時,打印設置信息且程序退出
# 爲了腳本繼續運行註釋掉
#echo ${ee} "\033[36mvar7 變量未聲明,打印設置信息:${var7:?變量未聲明}\033[0m"
#var8=
#echo ${ee} "\033[36mvar8 取值爲空,打印設置信息:${var7:?變量取值爲空}\033[0m"

# 通過前綴字符匹配聲明過的變量名
x1=1
x2=2
x3=3
echo ${ee} "\033[36m通過前綴字符匹配聲明過的變量名:${!x*}\033[0m"
echo ${ee} "\033[36m通過前綴字符匹配聲明過的變量名:${!x@}\033[0m"

url="https://www.toutiao.com/i6820392125645980174"
## 字符串長度
echo ${ee} "\033[36m字符串內容:${url}\033[0m"
echo ${ee} "\033[36m字符串長度:${#url}\033[0m"

## 字符串截取
# 字符串位置截取
echo ${ee} "\033[36m從左邊指定位置開始,截取後面所有字符串:${url:8}\033[0m"
echo ${ee} "\033[36m從左邊指定位置開始,截取指定長度字符串:${url:8:15}\033[0m"
echo ${ee} "\033[36m從右邊指定位置長度開始,截取後面所有字符串(注意“:”右邊有空格):${url: -20}\033[0m"
echo ${ee} "\033[36m從右邊指定位置長度開始,截取後面所有字符串(同上,推薦):${url:0-20}\033[0m"
echo ${ee} "\033[36m從右邊指定位置長度開始,截取後面所有字符串(同上,推薦):${url:(-20)}\033[0m"
echo ${ee} "\033[36m從右邊指定位置開始,截取指定長度字符串(注意“:”右邊有空格):${url:0-36:15}\033[0m"
echo ${ee} "\033[36m從右邊指定位置開始,截取指定長度字符串(同上,推薦):${url:0-36:15}\033[0m"
echo ${ee} "\033[36m從右邊指定位置開始,截取指定長度字符串(同上,推薦):${url:(-36):15}\033[0m"

## 截取不匹配的字符串,即刪除匹配的字符串
echo ${ee} "\033[36m從右邊開始,刪除最短匹配字符串:${url#*/}\033[0m"
echo ${ee} "\033[36m從右邊開始,刪除最長匹配字符串:${url##*/}\033[0m"

echo ${ee} "\033[36m從左邊開始,刪除最短匹配字符串:${url%/*}\033[0m"
echo ${ee} "\033[36m從左邊開始,刪除最長匹配字符串:${url%%/*}\033[0m"

## 匹配項替換
echo ${ee} "\033[36m從右邊開始,替換第一次出現匹配項:${url/\//#}\033[0m"
echo ${ee} "\033[36m替換所有匹配項:${url//\//#}\033[0m"

echo ${ee} "\033[36m替換開頭匹配字符串:${url/#https/http}\033[0m"
echo ${ee} "\033[36m替換結尾匹配字符串:${url/%i6820392125645980174/daodaotest}\033[0m"

param=daodaotest
# macOS zsh 不支持
echo ${ee} "\033[36m開頭第一個小寫字母轉換爲大寫:${param^}\033[0m"
echo ${ee} "\033[36m所有小寫字母轉換爲大寫:${param^^}\033[0m"

param=DAODAOTEST
# macOS zsh 不支持
echo ${ee} "\033[36m開頭第一個大寫字母轉換爲小寫:${param,}\033[0m"
echo ${ee} "\033[36m所有大寫字母轉換爲小寫:${param,,}\033[0m"

微信公衆號:daodaotest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章