For循环基本语法
#语法1
for 变量名 in 值1 值2 值3。。。
do
程序
done
#语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
while 循环
while [ 条件判断 ]
do
程序
done
Case分支
case $变量名 in
"值1")
如果变量值等于1,则执行此程序
;;
"值2")
如果变量值等于2,则执行此程序
;;
*)
如果变量值不等于以上列出的值,则执行此程序
;;
esac
If语句
if [ 条件判断式 ];then
程序
fi
#或者(推荐)
if [ 条件判断式 ];then
程序
elif [ 条件判断式 ];then
程序
fi
变量定义
定义变量:变量名=变量值,等号两边不能有空格,变量名一般习惯大写。使用变量:$变量名
将命令返回值赋值给变量:
A=`ls`反引号,执行里面的命令
A=$(ls)等价于反引号
获取变量最好加上双引号如echo "$var"
变量的作用域
默认情况下,shell里,定义的变量是全局变量,如果需要使用local变量,需要使用关键字local,声明为local的变量,在函数体内可以调用,函数外,不能调用。declare可以定义局部变量的类型,如数组,字符串,整形等。
返回值
shell中函数的返回值只能是整数,如0,1,如果非要传递字符串,可以用下面的方法
(一)函数位置参数调用,打印返回值。reg=$(函数名 参数1 参数2) echo $reg。
hellow=$1,world=$2
运行结果:
(二)脚本位置参数传递到函数
or
运行结果:
位置参数变量
$n:$0表示shell脚本本身的文件名.,如/a.sh,$1-$9代表第1到第9个参数,10以上用${}表示
$*:命令行所有参数,且把每个参数整体对待
$@:命令行所有参数,且把每个参数区分对待
$#:所有参数的个数
运算符$(())和$[]区别
都是运行算数运算,没有区别
函数
系统函数:basename,dirname
basename:用户获取文件名,删掉最后一个/前的所有部分,包括/。
dirname:用于获取路径,删掉路径最后一个/后的多有部分,包括/.
自定义函数
[ function ] funname(){
Action;
[return int;]
}
#调用
funname 参数1 参数2
我们可以实现python里的脚本结构:
#python
def func1():
pass
def func2():
pass
if __name__=='__main__':
func1()
func2()
#shell
#!/bin/bash
func1(){
}
func2(){
}
main(){
func1
func2
}
main "$@"
$*和$@的用法区别
他们在for循环里的用法没有区别,如果是带命令行参数就有区别。$*表示当作一个整体,$@表示单独一个个体。
#!/bin/bash
for i in "$*"
do
echo "this arg is $i"
done
#!/bin/bash
for i in "$@"
do
echo "this arg is $i"
done
运行结果
事后处理函数
有些时候,我们执行完脚本后,会产生一些临时文件,我们不必在脚本里rm -rf filename来一个个删除,我们可以定义一个函数来删除。然后,在需要执行的脚本最后调用这个脚本的函数即可。
Tip
读取文件时不要使用for loop而要使用while read
尽量使用func(){}定义行数
尽量使用$()将命令的返回值赋值给变量,而不是反引号
在复杂的场景下尽量使用printf代替echo进行回显
尽量使用[[]]来代替[]