2018年1月29日 星期一

Bash Shell | 如何取得字串長度,字串取代與大小寫置換

1. 取得字串長度
   要取得字串長度,只需要加上 # 即可

   ${#Parameter}

範例:

#!/bin/sh

var0="There is a dog."

echo \${#var0} = ${#var0}

結果:

${#var0} = 15

2. 字串取代
   有四種型式如下

   a. 取代第一個出現的 Pattern

     ${Parameter/Pattern/String}

     在變數 Parameter 的值中尋找是否出現 Pattern,出現的第一個被取代成           String

   b. 取代全部出現的 Pattern 

     ${Parameter//Pattern/String}

     在變數 Parameter 的值中尋找是否出現 Pattern,所有出現的 Pattern 都被取
     代成 String
   
   c. 取代字首出現的 Pattern

     ${Parameter/#Pattern/String}

     尋找變數 Parameter 值的字首是否出現 Pattern,出現 Pattern 則取代成 
     String

   d. 取代字尾出現的 Pattern

     ${Parameter/%Pattern/String}

     尋找變數 Parameter 值的字尾是否出現 Pattern,出現 Pattern 則取代成 
     String

範例:    

#!/bin/sh

var1="01234567890123456789"

echo ${var1/123/abc}
echo ${var1//123/abc}
echo ${var1/#012/ABC}
echo ${var1/%789/ABC}

結果:

0abc4567890123456789
0abc4567890abc456789
ABC34567890123456789
01234567890123456ABC

3. 大小寫置換
   a. 將字串中的小寫換成大寫

      ${Parameter^^?}

   b. 將字串中的大寫換成小寫

      ${Parameter,,?}

範例:

#!/bin/sh

var2="this is an example"
var3="THIS IS AN EXAMPLE"

echo ${var2^^?}
echo ${var3,,?}

結果:

THIS IS AN EXAMPLE
this is an example

2018年1月18日 星期四

Bash Shell | 如何取出子字串 Substring Expansion

想要取出子字串 (Substring) 可以使用如下的方式

${Parameter:offset}
${Parameter:offset:length}

offset
正值: 表示從變數 Parameter 之字串值的左邊開始算
負值: 表示從變數 Parameter 之字串值的右邊開始算

length
正值: 表示要取的子字串長度
省略: 表示取到字串結尾

注意:
1. offset 是負值時要與前面冒號間隔一個空白,否則會被當成${Parameter:-word}
2. offset 與 length 可以使用 Shell Arithmetic

範例:

#!/bin/sh

var0="01234567890"

echo \${var0} = ${var0}
echo \${var0:3} = ${var0:3}
echo \${var0:3:4} = ${var0:3:4}
echo \${var0: -6} = ${var0: -6}
echo \${var0: -6:3} = ${var0: -6:3}
echo \${var0:$(( 1+1 )):$(( 2+2 ))} = ${var0:$(( 1+1 )):$(( 2+2 ))}

結果:

${var0} = 01234567890
${var0:3} = 34567890
${var0:3:4} = 3456
${var0: -6} = 567890
${var0: -6:3} = 567
${var0:2:4} = 2345

2018年1月9日 星期二

Bash Shell | 如何宣告函式 Function

Bash 宣告函式(Function)可以用底下兩種格式

name () { }

or

function name [()] { }

範例:

#!/bin/sh

showFunc () 
{
        echo \$FUNCNAME = $FUNCNAME
}

function showParams
{
        echo \$# = $#
}

function showWhoami ()
{
        echo whoami =  $(whoami)
}

showFunc
showParams apple banana
showWhoami

結果:

$FUNCNAME = showFunc
$# = 2
whoami = william

1. 將函式(Function)寫成一行的方式
如果要將函式(Function)寫成一行,必須要注意,第一個 ( { ) 與其後一行指令至少要隔一個空白或是換行(newline),且指令後要加上分號( ; )或( & )或換行(newline),否則會有錯誤。

範例:

#!/bin/sh

showFunc () {echo \$FUNCNAME = $FUNCNAME}

結果:

./func.sh: line 3: syntax error near unexpected token `{echo'
./func.sh: line 3: `showFunc () {echo \$FUNCNAME = $FUNCNAME}'

2. 函式的參數
函式的參數是位置參數(Positional Parameters),可以透過 $1 $2 來取得,不同的是 $0 不是函式名,還是保持為 script 的名字,函數名可以透過變數 FUNCNAME 取得。

範例:

#!/bin/sh


function showParams
{
        echo \$# = $#
        echo \$0 = $0
        echo \$1 = $1
        echo \$2 = $2
        echo \$FUNCNAME = $FUNCNAME
}

結果:


$# = 2
$0 = ./func.sh
$1 = apple
$2 = banana
$FUNCNAME = showParams

3. 函式的離開狀態(Exit Status)(回傳值)
函式(Function)的離開狀態(Exit Status)(回傳值)是函式內最後一個被執行之指令的離開狀態(Exit Status)。另一個決定函式離開狀態(回傳值)的方式是使用內建指令 return,當 return 在函式內被執行後,函式會直接結束,函式的離開狀態(回傳值)會是 return 後的參數。

範例:


#!/bin/sh

showFunc () 
{
        echo \$FUNCNAME = $FUNCNAME
        declare -p FUNCNAME
}

function showParams
{
        echo \$# = $#
        delcare -p var0
}

function showWhoami ()
{
        echo whoami =  $(whoami)
        return 100
        echo "The command after return"
}

showFunc
echo \$? = $?
echo ""
showParams apple banana
echo \$? = $?
echo ""
showWhoami
echo \$? = $?

結果:

$FUNCNAME = showFunc
declare -a FUNCNAME='([0]="showFunc" [1]="main")'
$? = 0

$# = 2
./func.sh: line 12: delcare: command not found
$? = 127

whoami = william
$? = 100