前言
表示注释,但是第一行的#有特殊意义,用来指示解析器
#!/bin/bash
echo "hello world"
变量
普通变量
var=10
var1=20
expr ${var}+${var1}
str="hello"
echo ${str}
环境变量
echo ${PATH}
参数变量
my.sh 4 5 6
echo ${1}
echo ${2}
echo ${3}
#参数个数
echo $#
变量赋值
#命令结果赋值
var3=`ls -al`
#计算结果赋值
var3=`expr $var + $var1`
运行流程控制
数值比较
数值大小判断使用: -lt -gt -eq -ne -le -ge -ne
score=85
if [ $score-ge 80 ]
then
echo "A"
elif [ $score -ge 70 ]
then
echo "B"
else
echo "C"
fi
字符串比较
if [ $var = $var1 ]
then
echo var1 is var2
else
echo var1 is not var2
fi
文件条件
-e 判断文件是否存在
-d 判断是否目录
-f 判断是否是文件
if [ -e ./file1 ]
then
echo "file executable"
else
echo "file not executable"
fi
逻辑表达式
-a 与
-o 或
if [ $var1 -eq 100 -a $var2 -eq 100 -o $var2 -eq 200 ]
then
echo "true"
fi
条件短路
如果文件存在,就不执行echo
! ls filename && echo "file not exist"
循环
for
var="a b c d"
for v in &var
do
echo $v
done
输出当前目录的普通文件
files=`ls`
echo $files
for file in $files
do
if [ -f $file ]
then
echo $file
fi
done
while
1累加到100
var=1
sum=0
while [ $var -le 100]
do
sum=`expr &var + $sum`
var=`expr $var + 1`
done
echo $sum
case
var=$1
case $var in
ok)
echo "ok"
;;
notok)
echo "not ok"
;;
*)#其他条件
echo "others"
;;
esac
模块化
函数
myfunc(){
echo "helloworld"
}
myfunc
脚本执行脚本
#this is t02.sh
var=200
#this is t01.sh
var=100
./t02.sh
# t02.sh是在另外一个进程环境中,所以它修改var,是它自己的var
# 跟t01.sh没有关系
# var=100
echo $var
# 使用. 来执行脚本时,这个脚本的执行环境是和调用它的脚本属于同一个进程
. t02.sh
# var=200
echo "now is:" $var
var=100
# 使用source来执行脚本和使用. 来执行脚本,效果是一样的
source t02.sh
echo $var
重定向
ls -al > a.txt
ls -al >> a.txt
grep 1.txt < ls -al
read从标准输入中获取数据
read var
echo $var
退出码
exit 123
echo $?
xargs
xargs和重定向配合,用来将之前命令的输出的每一个元素,作为后面一个命令的参数,进行执行,可能运行多次。
#ls 的结果作为rm 的参数,有几个文件就运行几次rm
ls | xargs rm