字符串操作符
表達式 | 含義 |
---|---|
${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} |
從右邊開始,替換第一次出現匹配項 pattern 爲 string |
${parameter//pattern/string} |
替換所有匹配項 pattern 爲 string |
${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