天天看點

Bash字元串處理(與Java對照) - 3.給(字元串)變量指派Bash字元串處理(與Java對照) - 3.給(字元串)變量指派

Bash字元串處理(與Java對照) - 3.給(字元串)變量指派

In Java

簡單指派情況

s = "Hello";

一次給多個變量指派的情況

s1 = s2 = "Same";

指派為整數(将整數轉換為字元串)

int i = 1234;

s = String.valueOf(i);

或 s = "" + i;

In Bash

指派符号(=)

指派操作的形式為 VAR=STRING

記住:等号的兩邊不能有空格!

Advanced Bash-Scripting Guide: 4.2. Variable Assignment 寫道 =

the assignment operator (no space before and after)

Caution

Do not confuse this with = and -eq, which test, rather than assign!

Note that = can be either an assignment or a test operator, depending on context.  

指派為字元串常量

不包含任何特殊字元的情形

示例:S1=Literal

示例:S1='Literal'

示例:S1="Literal"

示例:S1=$'Literal'

包含空格的情形

示例:S2=Hello\ World

示例:S2='Hello World'

示例:S2="Hello World"

示例:S2=$'Hello World'

包含單引号的情形

示例:S3=Yes,\ I\'m\ Basher

示例:無法純粹用單引号來做到

示例:S3="Yes, I'm Basher"

示例:S3=$'Yes, I\'m Basher'

包含雙引号的情形

示例:S4=It\ is\ very\ \"Stupid\".

示例:S4='It is very "Stupid".'

示例:S4="It is very \"Stupid\"."

示例:S4=$'It is very "Stupid".'

多行文本的情形

示例:S5='Hello

World'

示例:S5="Hello

World"

示例:S5=$'Hello

World'

指派為另一個變量的值

普通變量

示例:S2=$S1

示例:S2=${S1}

位置參數

示例:S3=$1

示例:S3=${1}

指派為指令行執行輸出(指令替換)

格式:S2=`commandline`

格式:S2=$(commandline)

格式:S2="`commandline`"

格式:S2="$(commandline)"

建立一個腳本,輸出Sha-Bang和Bash執行檔案路徑,也就是腳本的第一行。

[[email protected] ctmw]# echo '#!'$(which bash) > script.sh

[[email protected] ctmw]# cat script.sh

#!/bin/bash

[[email protected] ctmw]#

指派為更複雜的字元串替換結果

示例:S1="Your account is ${ACCOUNT}"

示例:S2="Current Working Directory is $(pwd)"

指派為空串

示例:S=

一次性給多個變量賦同一個值

在Java中,我們可以寫 a = b = "String";

但是在Bash中,我們隻能這樣寫 A=$B B="STRING"

示例:A=$B B=$C

先把變量C指派給B,再把變量B指派給A。

注意不能寫成:A=B=C,而 A=B B=C 的結果完全與此不同。

指派為檔案内容

格式:CONTENT=$(cat filename)

注意:如果filename指定的檔案是二進制資料檔案,那麼CONTENT實際的内容可能實際的不一緻。

文本檔案的情形

[[email protected] ~]# cat file.txt

1234

2345

4567

5678

[[email protected] ~]# ls -l file.txt

-rw-r--r-- 1 root root 20 09-07 07:48 file.txt

[[email protected] ~]# S=$(cat file.txt)

[[email protected] ~]# echo $S

1234 2345 4567 5678

[[email protected] ~]# echo "$S"

1234

2345

4567

5678

[[email protected] ~]# echo ${#S}

19

[[email protected] ~]#

上面的 ${#S} 是用來取得字元串長度的。

即使是文本檔案,其長度也是不一緻的,但字元串内容是一緻的。

二進制檔案的情形

[[email protected] root]# ls -l /usr/bin/ac

-rwxr-xr-x    1 root     root        18452 2006-01-27  /usr/bin/ac

[[email protected] root]# S=$(cat /usr/bin/ac)

[[email protected] root]# echo ${#S}

13516

[[email protected] root]# S="$(cat /usr/bin/ac)"

[[email protected] root]# echo ${#S}             

13511

[[email protected] root]#

上面的 ${#S} 是用來取得字元串長度的。

問題:為什麼使用cat加載檔案的内容與實際的檔案内容會不同呢?

指派為整數

由于Shell中的變量是無類型的,所有直接将整數指派給變量即可,無需任何轉換手段。

格式:STR=SOME_INTEGER

但如果将一個算式指派給變量,不會自動計算,可以采用如下幾種方式:

格式1:STR=$[EXPR]

格式2:((STR=EXPR))

格式3:let STR=EXPR

格式4:declare -i STR=EXPR

格式5:STR=`expr EXPR`

格式6:STR=$(expr EXPR)

[[email protected] ~]# STR=1234

[[email protected] ~]# echo $STR

1234

[[email protected] ~]# STR=1234+4321

[[email protected] ~]# echo $STR    

1234+4321

直接将算式指派給變量,還是算式本身,不會是計算結果。

[[email protected] ~]# STR=$[1234+4321]

[[email protected] ~]# echo $STR       

5555

[[email protected] ~]# ((STR=1234+4321))

[[email protected] ~]# echo $STR          

5555

[[email protected] ~]# let STR=1234+4321

[[email protected] ~]# echo $STR         

5555

[[email protected] ~]# declare -i STR=1234+4321

[[email protected] ~]# echo $STR                

5555

[[email protected] ~]# STR=`expr 1234+4321`

[[email protected] ~]# echo $STR            

5555

[[email protected] ~]# STR=$(expr 1234+4321)

[[email protected] ~]# echo $STR             

5555

[[email protected] ~]#

本文連結:http://codingstandards.iteye.com/blog/1167238   (轉載請注明出處)

傳回目錄:Java程式員的Bash實用指南系列之字元串處理(目錄) 

上節内容:Bash字元串處理(與Java對照) - 2.字元串的表示方式(字元串常量)

下節内容:Bash字元串處理(與Java對照) - 4.字元串輸出