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