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執行文件路徑,也就是腳本的第一行。
[root@jfht ctmw]# echo '#!'$(which bash) > script.sh
[root@jfht ctmw]# cat script.sh
#!/bin/bash
[root@jfht 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實際的內容可能實際的不一致。
文本文件的情形
[root@jfht ~]# cat file.txt
1234
2345
4567
5678
[root@jfht ~]# ls -l file.txt
-rw-r–r– 1 root root 20 09-07 07:48 file.txt
[root@jfht ~]# S=$(cat file.txt)
[root@jfht ~]# echo $S
1234 2345 4567 5678
[root@jfht ~]# echo "$S"
1234
2345
4567
5678
[root@jfht ~]# echo ${#S}
19
[root@jfht ~]#
上面的 ${#S} 是用來取得字符串長度的。
即使是文本文件,其長度也是不一致的,但字符串內容是一致的。
二進制文件的情形
[root@smsgw root]# ls -l /usr/bin/ac
-rwxr-xr-x 1 root root 18452 2006-01-27 /usr/bin/ac
[root@smsgw root]# S=$(cat /usr/bin/ac)
[root@smsgw root]# echo ${#S}
13516
[root@smsgw root]# S="$(cat /usr/bin/ac)"
[root@smsgw root]# echo ${#S}
13511
[root@smsgw 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)
[root@jfht ~]# STR=1234
[root@jfht ~]# echo $STR
1234
[root@jfht ~]# STR=1234+4321
[root@jfht ~]# echo $STR
1234+4321
直接將算式賦值給變量,還是算式本身,不會是計算結果。
[root@jfht ~]# STR=$[1234+4321]
[root@jfht ~]# echo $STR
5555
[root@jfht ~]# ((STR=1234+4321))
[root@jfht ~]# echo $STR
5555
[root@jfht ~]# let STR=1234+4321
[root@jfht ~]# echo $STR
5555
[root@jfht ~]# declare -i STR=1234+4321
[root@jfht ~]# echo $STR
5555
[root@jfht ~]# STR=`expr 1234+4321`
[root@jfht ~]# echo $STR
5555
[root@jfht ~]# STR=$(expr 1234+4321)
[root@jfht ~]# echo $STR
5555
[root@jfht ~]#
作者“Bash @ Linux”