shell脚本

运行

在线运行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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值