SHELL编程
一、脚本执行
创建脚本
vi helloworld.sh
#脚本以#!/bin/bash开头(指定解析器)
#!/bin/bash
echo "hello world"
touch 1.txt 2.txt 3.txt
ls -l > 1.txt
执行脚本
第一种方式 分配执行权
chmod u+x helloworld.sh
./helloworld.sh
/mysh/helloworld.sh
第二种方式 可以没有执行权
bash helloworld.sh
sh hellowrold.sh
二、变量
1.系统变量
使用set可以查看所有系统变量
BASH=/bin/bash
HOME=/root
HOSTNAME=linux01
JAVA_HOME=/opt/apps/jdk1.8.0_191
PATH=/usr/local/sbin:/usr/local
2. 自定义变量
变量定义
变量名=变量值 #注意不能有空格
删除变量
unset 变量名
声明常量 readonly变量,不能使用unset变量
name=zss
name=lss 改值
age=23
gender=M
readonly USERNAME=Ly 不可变的变量 常量
取值
$name
${name}
"$name"
'$name' ---> $name的字符串
注意字符串的拼接
echo $name lss
echo ${name} lss
echo "$name"aaa lssaaa ""号中取变量的值可以正常取出
echos '$name'aaa $nameaaa ''号中取不出来变量的值 就是$name字符串 单引号会将所有特殊字符脱意
3.export和source
export username=lisi 将变量的范围作用在所有的子bash中
source 将子bash定义的变量 作用在当前bash
export 修饰的变量的作用域是 当前和所有的子进程
source 将子进程中的变量 拉取到当前
4 特殊变量
$1 $2 $n ${10} 接收单个参数
$* 接收所有参数
$@ 接收所有参数
$# 参数的个数
$? 接收上个命令执行的结果 0 执行成功 非0的是执行失败
接收单个参数 一直到$9都可以 10以上 ${10}
vi args01.sh
#!/bin/bash
echo "接收的所有参数$1 $2 $3"
touch $1 $2 $3
sh args01.sh 1.txt 2.txt 3.txt
接收所有参数
$* 接收所有参数
$@ 接收所有参数
$# 参数的个数
$? 接收上个命令执行的结果 0 执行成功 非0的是执行失败
vi args02.sh
#!/bin/bash
echo "接收参数的个数$*"
echo "接收参数的个数$#"
touch $*
#!/bin/bash
echo "接收参数的个数$@"
echo "接收参数的个数$#"
touch $@
sh args02.sh 1.java 2.java
5.read交互
#!/bin/bash
read -t 10 -p '请输入您的用户名:' username #username用来接收用户输入的用户名 -t 10代表10秒不输退出
read -t 10 -p '请输入您的密码:' password
echo "$username"
echo "$password"
6.条件判断
**&&和||**
&&:用来执行条件成立后执行的命令
||:用来执行条件不成立后的执行命令
ping windows && echo yes || echo no windows能ping通 输出yes 不能ping通输出no
ls && echo yes || echo no ls执行成功 输出yes 执行不成功输出no
7.if语句判断
单条件判断
if [ 条件 ]
then
执行
fi
互斥条件判断
if [ 条件 ]
then
程序
else
程序
fi
#!/bin/bash
read -p '请输入您的年龄:' AGE
if [ $AGE -ge 18 ]
then
echo "你成年了可以看片了"
else
echo "你还未成年 滚蛋"
fi
#判断传入的参数 $1是否存在 存在打印值 不存在 则输出不存在
#!/bin/bash
name=$1
if [ $name ]
then
echo "$name"
else
echo "name不存在"
fi
多条件判断
if [ 条件1 ]
then
执行
elif [ 条件2 ]
then
执行
...
else
执行
fi
#!/bin/bash
if [ $1 -ge 90 -a $1 -le 100 ]
then
echo "优秀"
elif [ $1 -ge 80 -a $1 -lt 90 ]
then
echo "良好"
elif [ $1 -ge 60 -a $1 -lt 80 ]
then
echo "及格"
elif [ $1 -ge 0 -a $1 -lt 60 ]
then
echo "潜力非常大"
else
echo "分数有误"
fi
8.case选择语句
#!/bin/bash
read -p '请输入一个数字(1-7):' NUM
case $NUM in
1 )
echo "星期一"
;;
2 )
echo "星期二"
;;
3 )
echo "星期三"
;;
4 )
echo "星期四"
;;
5 )
echo "星期五"
;;
6 )
echo "星期六"
;;
7 )
echo "星期日"
;;
* )
echo "你瞎啊"
;;
esac
三、循环
for循环
for (( 初始化表达式;布尔表达式;步进表达式 ))
do
程序
done
#!/bin/bash
for (( i=0 ;i<=100;i++ ))
do
echo "$i"
done
#!/bin/bash
sum=0
for(( i=0;i<=100;i++))
do
sum=$[$sum+$i]
done
echo $sum
for 变量 in 值1 值2 值3
do
程序
done
或者写成一行
for 变量 in 值1 值2 值3 ; do 程序 ; done
#!/bin/bash
for N in $*
do
echo $N
done
for循环案例:在每台机器的根目录下 创建一个当前日期的文件夹 如果文件夹已存在则删除 创建 如果不存在则创建
#!/bin/bash
for hostname in linux01 linux02 linux03 #linux0{1..3} `cat workers`
do
echo "连接$hostname"
ssh $hostname "if [ -e /`date +%Y-%m-%d` ]
then
echo "先删除再创建"
rm -rf /`date +%Y-%m-%d`
mkdir /`date +%Y-%m-%d`
else
echo "直接创建文件夹"
mkdir /`date +%Y-%m-%d`
fi; exit"
echo "退出$hostname"
done
vi workders
linux01
linux02
linux03
while循环
while [ 条件判断式 ]
do
程序
...
done
#!/bin/bash
案例
num=1
while [ $num -le $1 ]
do
echo "$num"
#num=$[$num+1]
let num++
sleep 1 #睡眠1秒
done