运行
在线运行shell: https://c.runoob.com/compile/18
s1.sh
#!/bin/bash
varRunWay=$1
echo way is: $varRunWay
echo PID of s1 is $$
case $varRunWay in
sh) sh ./s2.sh;;
fork) ./s2.sh;;
source) source ./s2.sh;;
exec) exec ./s2.sh;;
*) echo 'params error';;
esac
echo parent-shell
s2.sh
#!/bin/bash
echo PID of s2 is $$
res
sh s1.sh sh
way is: sh
PID of s1 is 10945
PID of s2 is 10946
parent-shell
sh s1.sh fork
way is: fork
PID of s1 is 10947
PID of s2 is 10948
parent-shell
sh s1.sh source
way is: source
PID of s1 is 10949
PID of s2 is 10949
parent-shell
sh s1.sh exec
way is: exec
PID of s1 is 10950
PID of s2 is 10950
变量
一:变量使用
#!/bin/bash
# 全局变量(普通变量)
varName=varVal
varName=90
# 环境变量
export varName
# export function
export funName
# 只读变量
readonly varName
# 函数局部变量
function funName(){
local varName = 100
}
# 用命令运行结果赋值
varName=`ls`
varName=$(ls)
二:数组
#!/bin/bash
varName=(1 2 3)
echo "length of array: ${#varName[*]}"
echo "first element of array: ${varName[0]}"
echo "all element of array: ${varName[*]}"
# assign a new value
varName[1]=20
echo "all element of array: ${varName[@]}"
三:字符串
1,单双引号
#!/bin/bash
# right
echo "t'"f"$varName"
# error
echo "t'"'f"$varName'"
2,字符串操作
2.1,查找字符串位置
#!/bin/bash
varName="this is a string"
echo "length of string: ${#varName}" #16
echo "find char s or a in string: "`expr index "$varName" sa` #4
2.2,截取字符串
#!/bin/bash
varName="this is a string"
# ${varName:startIndex:length}
echo ${varName:2:5} #is is
# return origin string when startIndex is a negative number
echo ${varName:-2:5} #this is a string
# ${varName:lastIndex:length}
echo ${varName:(-6):5} #strin
# ${varName:startIndex:endIndex}
echo ${varName:2:-3} #is is a str
2.3,查找并截取
#!/bin/bash
varName="this is a string"
# must match from the beginning of the string
echo ${varName#is} #this is a string
echo ${varName#thi} #s is a string
echo ${varName#*is} # is a string
echo ${varName##*is} # a string
echo ${varName%ng} #this is a stri
echo ${varName%is*} #this
echo ${varName%%is*} #th
2.4,替换字符串
#!/bin/bash
varName="this is a string"
echo ${varName/is/name} #thname is a string
# global match
echo ${varName//is/name} #thname name a string
# must match from the beginning of the string
echo ${varName/#his/name} #this is a string
2.5,匹配
2.5.1,模式匹配(*、?、[]、[!]、[^])
#!/bin/bash
varName="this is a string"
echo ${varName#??i} #s is a string
varName="11.shtest"
echo ${varName#[^23]?.s} #htest
#yes
if [[ $varName = [^23]?.s"ht"* ]]
then echo yes
else echo no
fi
2.5.2,正则匹配
#!/bin/bash
#yes
varName="11.shtest"
if [[ $varName =~ ^[0-1]{2}\..* ]]
then echo yes
else echo no
fi
2.5.2.1,获取正则匹配结果
[[ $varName =~ ^([0-1]{2})\.(.{2}).* ]]
echo ${BASH_REMATCH[*]} #11.shtest 11 sh
2.5.3,字符类匹配
#!/bin/bash
varName="11.shtest"
[[ $varName =~ ^[[:digit:]]{2}\.[[:lower:]]{2}.* ]] #yes
3,函数
#!/bin/bash
varName=100
# define function
funName(){
echo "length of params: $#" #1
echo "all params: $*" #p1 p2
echo file name is: $0
echo param1 is: $1 #p1
return 5
echo global varName: $varName #100
local varName=90
echo local varName: $varName #90
}
# call function
funName p1 p2
# get result of function
echo $? #5
echo global varName: $varName #100
运算
一:数学运算(只支持整数运算)
#!/bin/bash
expr 2 + 5 #7
expr 2 \* 5 #10
echo `expr 17 % 2` #1
echo $[15+2] #17
echo $((15#20 + 2)) #32
echo $((17.2 / 2)) # error
expr t10 / 2 # error
echo $((t10 / 2)) #0
expr 10t / 2 # error
echo $((10t / 2)) # error
varName=100
varName+=5 #varName=1005
((varName+=10)) #varName=1015
varName++ #error
((varName++)) #varName=1016
二:expr
1,判断是否是整数
expr 1 + $varName > /dev/null 2>&1
if (( $? == 0 ))
then echo true
else echo false
fi
2,字符串操作
expr length "hello world"
varName=`expr index "hello world" lr`
# expr substr "$varName" startIndex length
expr substr "this is a test" 3 5
三:关系运算符
[ 1 -eq 2 ] # ne gt lt ge le
四:布尔运算符
# -a 与 -o
if [ 1 = 1 -a 2 = 3 -o ! 5 = 5 ] #no
五:逻辑运算符
if [[ 1 = 1 && 2 = 3 || ! 5 = 5 ]] #no
if [[ 1 = 1 ]] && [[ 2 = 3 ]] || [[ 5 = 5 ]] #yes
if (( 1 == 1 && 2 == 3 || ! 5 == 5 )) #no
if (( 1 == 1 )) && (( 2 == 3 )) || (( 5 == 5 )) #yes
1,短路效果
# varName不会被赋值
if ((6==6))||((varName=1009))
then echo true
fi
六:字符串运算符
if [ -n "" ] #false
if [ -n " " ]#true
varName=" "
if [ -z "$varName" ] #false
# 如果变量两边没有引号,会忽略变量里的空格
if [ $varName ] #false
if [[ $varName ]] #true
if [ "$varName" ] #true
七:文件测试运算符
# 文件是否存在
if [ -e 1.sh ]
if [ -e $file ]
表达式
一,条件表达式
#!/bin/bash
if [ 10 == '1' ]
then echo yes
elif [ 2 = '2']
then echo yes too
else
echo no
fi
# 对空字符串与0的判断
if [ ] # no
then echo yes
else echo no
fi
# if [[ '' ]] # no
# if (( )) # no
if [ 0 ] # yes
then echo yes
else echo no
fi
# if [ 0 ] # yes
# if (( 0 )) # no
1,[] 等价与 test
# 文本比较符
if [ 12 -gt 2 ] #yes
then echo yes
else echo no
fi
# 数学比较符
if [ 12 \> 2 ] #no
then echo yes
else echo no
fi
if [ 12 -gt 2 -a 12 \< 2 ] #yes
if test 12 -gt 2 -a 12 \< 2 #yes
if [ 12 -gt 2 ] && [ 5 = '5' ] #yes
2,[[]]
if [[ 12 -gt 2 ]] #yes
if [ 12 > 2 ] #no
if [[ 12 -gt 2 || 12 \< 2 ]] #yes
if [[ 12 -gt 2 ]] || [[ 5 = '5' ]] #yes
2.1,模式匹配和正则匹配
if [[ hello = hel* ]] #yes
if [[ hello =~ ^he[a-z]{3}$ ]] #yes
3,(()) :只能比较整数(其它内容转成整数)
# 0时为false
# if (( notVarName )) #false
# if (( 1 )) #true
varName1=11
varName2=5
if (( varName1 > varName2 )) #true
if (( varName3=0 )) #false
if (( varName1 > varName2 || 8 >= 7 )) #true
if (( varName1 > varName2 )) || (( 8 >= 7 )) #true
# 以最后一个条件作为判断依据
if (( varName2=19, varName2 > varName1 )) #true
二,while语句
varName=0
while ((varName<=5))
do echo $((varName++))
done
三,until语句
varName=0
until ((varName>5))
do echo $((varName++))
done
四,case语句
varName=val3
varName2=val3
case $varName in
val1) echo 1;;
val2|${varName2}) echo 2-3;;
*) echo default;;
esac
五,for循环
varName="t1 t2 t3"
for item in $varName
do echo ${item}
done
for item in val1 $varName
do echo ${item} #val1 t1 t2 t3
done
varName2=(t1 t2 t3)
for ((i=0;i<${#varName2[*]};i++))
do echo ${varName2[$i]} #t1 t2 t3
done