shell腳本字元串連接
1. linux shell 字元串拼接方法
CROSS_COMPILE=arm-openwrt-linux-muslgnueabi-
echo $CROSS_COMPILE
方法1:
test1=$(echo $CROSS_COMPILE)gcc
echo $test1
方法2:
test2=${CROSS_COMPILE}gccabc
echo $test2
2. shell字元串拼接
字元串最好放到雙引號中,防止中間有空格,如name中就可能存在空格。
改為:
total="${name}""${email}""${other}"
或者 total="$name""$email""$other"
3. Shell腳本:${...}在字元串中的多種用法
1、${var}
限定變數。
如果一個變數名A是另一個變數名AB的前部分,那麼,如果要在AB相連時,要得到A的值,就必須使用${var}限定。
如果變數名不會產生歧義時(即獨立的變數名),${var}與$var沒有任何區別。
var="hello"
var_01="hello01"
echo $var $var_01 ${var}_01
>>> hello hello01 hello_01
2、${#var}
得到變數var的長度
var="hello"
echo ${#var}
>>> 5
3、${var#}
刪除變數首部的字元(串),
"#"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
var="hello"
echo ${var#he}
>>> llo
var="/res_pos/path/from/something"
echo ${var#/}
>>> res_pos/path/from/something # 刪除第一個"/"
echo ${var#/*/}
>>> path/from/something # 刪除首部匹配"/*/"的串,即"/res_pos/"
4、${var##}
刪除變數首部的字元(串),
只是,當使用2個"##"時,匹配是貪婪的(貪婪匹配,也就是盡可能多的匹配)。
echo ${var##/*/}
>>> something # 刪除首部匹配"/*/"的串,即"/res_pos/path/from/"。
5、${var%}
刪除變數尾部的字元(串),
"%"後面的可以是字面串,也可以是正則表達式(惰性匹配)。
var="hello"
echo ${var%llo}
>>> he
var="~/res_pos/path/from/something"
echo ${var%/*}
>>> ~/res_pos/path/from # 刪除尾部的"/something"
6、${var%%}
刪除變數尾部的字元(串),
只是,當使用2個"%%"時,匹配是貪婪的(對應於第4條)
var="~/res_pos/path/from/something"
echo ${var%/*}
>>> ~ # 刪除第一個的"/"後的所有所有內容(包括"/"),貪婪匹配中,"/*"就是"/"後的所有字元串
7、${var::}
跟python的切片概念相似,取變數var的起始索引,
指定長度的子串(${var:索引:長度})。
var="~/res_pos/path/from/something"
echo ${var:0:5}
>>> ~/res
echo ${var:1:5}
>>> /res_ # 可見,字元串的索引是從0開始的
echo ${var::5}
>>> ~/res # 省略"索引",默認為從0開始
echo ${var:1:}
>>> # 省略"長度",默認長度為0,所以輸出為空
8、${var//}
字元串替換。
將var中的字元串A替換成字元串B(${var/A/B})。
var="hello world"
echo ${var/hello/hi}
>>> hi world # 字元串"hello"替換成了"hi"
echo ${var/l/X}
>>> heXlo world # 第一個"l"替換成了"X"
9、${var///}
字元串替換,
與第8點相同,只不過,現在是將所有出現的串A替換成串B(${var//A/B})。
var="hello world"
echo ${var//l/X}
>>> heXXo worXd # 所有的"l"都替換成了"X"
10、${var/#/}
替換字元串首部的串A為串B,
(${var/#A/B}),與第8點不同的是,這里只替換首部的串A。
var="hello world. hello baby."
echo ${var//h/H}
>>> Hello world. Hello baby. # 將所有"h"替換成了"H"
echo ${var/#h/H}
>>> Hello world. hello baby. # 將首部的"h"替換成了"H"
echo ${var/e/E}
>>> hEllo world. hello baby. # 將第一個出現的"e"替換成了"E"
echo ${var/#e/E}
>>> hello world. hello baby. # 首字元不是"e",所以沒有進行任何替換,原樣輸出。
11、${var/%/}
替換字元串尾部的串A為串B,
(${var/%A/B}),與第10點相似,只是這是處理的是字元串尾。
var="hello hello"
echo ${var/%o/END}
>>> hello hellEND # 將尾部的字元"o",替換成了"END"。
4. hell 如何在bash腳本中連接兩個字元串變數
bash在一個腳本里引用另一個腳本定義的變數有3種方法:
fork(/directory/script.sh)
fork是最普通的,就是直接在腳本裡面用/directory/script.sh來調用script.sh這個腳本.
運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候,parent-shell還在。
sub-shell執行完畢後返回parent-shell.sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell
exec(exec/directory/script.sh)
exec與fork不同,不需要新開一個sub-shell來執行被調用的腳本.被調用的腳本與父腳本在同一個shell內執行。但是使用exec調用一個新腳本以後,父腳本中exec行之後的內容就不會再執行了。這是exec和source的區別
source(source/directory/script.sh)
與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行.所以被調用的腳本中聲明的變數和環境變數,都可以在主腳本中得到和使用.
可以通過下面這兩個腳本來體會三種調用方式的不同:
1.sh
#!/bin/bash
A=B
echo"PIDfor1.shbeforeexec/source/fork:$$"
exportA
echo"1.sh:$Ais$A"
case$1in
exec)
echo"usingexec…"
exec./2.sh;;
source)
echo"usingsource…"
../2.sh;;
*)
echo"usingforkbydefault…"
./2.sh;;
esac
echo"PIDfor1.shafterexec/source/fork:$$"
echo"1.sh:$Ais$A"
2.sh
#!/bin/bash
echo"PIDfor2.sh:$$"
echo"2.shget$A=$Afrom1.sh"
A=C
exportA
echo"2.sh:$Ais$A"
執行情況:
$./1.sh
PIDfor1.shbeforeexec/source/fork:5845364
1.sh:$AisB
usingforkbydefault…
PIDfor2.sh:5242940
2.shget$A=Bfrom1.sh
2.sh:$AisC
PIDfor1.shafterexec/source/fork:5845364
1.sh:$AisB
$./1.shexec
PIDfor1.shbeforeexec/source/fork:5562668
1.sh:$AisB
usingexec…
PIDfor2.sh:5562668
2.shget$A=Bfrom1.sh
2.sh:$AisC
$./1.shsource
PIDfor1.shbeforeexec/source/fork:5156894
1.sh:$AisB
usingsource…
PIDfor2.sh:5156894
2.shget$A=Bfrom1.sh
2.sh:$AisC
PIDfor1.shafterexec/source/fork:5156894
1.sh:$AisC
$
5. ubuntu shell腳本文件連接字元串問題
((retnum=$RANDOM%max+min))
(( ))這種會新建shell運行,結果只在新建shell中有效,執行完畢回到原shell中,變數retnum的值是帶不過來的,直接丟失。
改為:
retnum=$((RANDOM%max+min))
這樣,返回值能保留在當前shell中。
$(( ))是bash中用於數學運算的特有符號。
6. linux中用shell時奇怪的字元串拼接和時間計算問題
testt=$(date +%Y-%m-%d)
date2="14/08/12"
test=20
testtt="${test}${date2}"
time1=$(date +%s -d "$testt" )
time2=$(date +%s -d "$testtt" )
time=$(($time1-$time2))
echo $time
改成引號,去掉括弧!!
7. 請教shell腳本里如何進行字元串匹配
比如說傳入的參數是str
tmpstr=`echo &str|awk '{print substr($0,length($0)-1),2}'信寬 #取滑悔亮最後兩位
if [ "$tmpstr" == "aa" ];then
......
elif [ "$tmpstr" == "前御bb" ]; then
......
fi