Shell编程
资料文档
- Linux高级、虚拟机、Linux命令、JDK&MYSQL安装
- Shell编程、Shell脚本综合(JDK脚本安装、数据库定时备份脚本)
- 集群环境准备
简介
- 解释型语言,不需要编译
- shell的数据类型:字符串和整型
变量
用户变量
- 定义变量
username="znyoung" #不能使用空格,最好用双引号
- 访问变量
echo "${username}" #最好用双引号,防止有空格
- 变量的其他赋值方式
#!/bin/bash
echo "who are you?"
read name #从键盘获取变量的值
pwd_string=$(pwd) #将当前的绝对路径赋值给pwd_string变量
date_string=`date` #将当前时间赋值给date_string变量,注意这里使用的是反引号
echo "hello, $name"
echo $pwd_string
echo $date_string
- 只读变量
#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
- 删除变量
#!/bin/sh
myUrl="http://www.runoob.com"
unset myUrl
echo $myUrl
环境变量
env #查看所有的系统变量
echo $PATH #输出环境变量PATH
export 变量名=变量值 #在/etc/profile后面追加
特殊变量
- 执行shell脚本时,向脚本传递参数,可以用特殊变量来获取这些参数,以下示例:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示*:$*";
./test5.sh aaa bbb ccc #执行脚本
#执行结果
Shell 传递参数实例!
执行的文件名:./demo4.sh
第一个参数为:aaa
第二个参数为:bbb
第三个参数为:ccc
参数个数为:3
传递的参数作为一个字符串显示*:aaa bbb ccc
字符串
单引号
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的,单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
拼接字符串
- 双引号随便拼,可拼转义
#!/bin/bash
yourname="maizy"
wenhou_1="你好,$yourname ."
wenhou_2="你好,"$yourname" ."
wenhou_3="你好,\"$yourname\" ."
echo $wenhou_1 $wenhou_2 $wenhou_3
你好,maizy . 你好,maizy . 你好,"maizy" . #输出结果
- 单引号
#!/bin/bash
yourname="乔布斯"
wenhou_4='你好,$yourname.'
wenhou_5='你好,'$yourname.''
wenhou_6='你好,"$yourname" .'
echo $wenhou_3 $wenhou_4 $wenhou_5
你好,$yourname. 你好,乔布斯. 你好,"$yourname" . #输出结果
获取字符串长度
#!/bin/bash
string="jobs"
echo ${string} # jobs
echo ${#string} # 4
截取字符串
#!/bin/bash
string="截取字符串"
echo ${string:2,2} #字符
算数运算符
#表达式和算数运算符之间要有空格,完整的表达式要被``包含
#乘法运算需要加转义符\*
val=`expr 2 + 2`
echo $val
#!/bin/bash
a=4
b=20
#加法运算
echo `expr $a + $b`
#减法运算
echo `expr $a - $b`
#乘法运算,注意*号前面需要反斜杠
echo `expr $a \* $b`
#除法运算
echo `expr $a / $b`
#此外,还可以通过$(())、$[]进行算术运算。
echo "a = $a"
c=$((a+b))
d=$[a+b]
echo "c = $c"
echo "d = $d"
流程控制
语句判断
数字
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等,相等返回 true。 |
-ne | 检测两个数是否不相等,不相等返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 |
字符串
判断符 | 说明 |
---|---|
-n STRING | 字符串长度不为零 |
-z STRING | 字符串长度为0 |
= | 判断两个字符串是否一样 |
!= | 判断两个字符串是否不一样 |
文件
判断符 | 说明 |
---|---|
-f | 存在且是普通文件 |
-d | 存在且是目录 |
-h | 存在且是符号链接 |
-e | 文件存在 |
–r | 文件存在并且可读 |
–w | 文件存在并且可写 |
–x | 文件存在并且可执行 |
if语句
if
#判断当前系统是否有多个ssh进程
#!/bin/bash
if [ $(ps -ef|grep -c "ssh") -gt > 1 ]
then
echo="true"
fi
#判断文件是否存在,不存在则创建
#!/bin/bash
filePath="/export/shell"
if [ ! -e $filePath ]
then
mkdir $filePath
fi
if elif else
#判断是否成年
#!/bin/bash
read -p "please enter your age:" age
if [ $age -lt 18 ]
then
echo "您未成年"
elif [ $age -gt 18]
then
echo "您已经成年"
else
echo "您刚好成年”
fi
for循环
字符型循环
for 变量 in 值1 值2 值3…
do
程序
done
#打印/root目录下所有的文件
#!/bin/bash
for fileName in $(ls /root)
do
echo $fileName
done
数字型循环
#与java、js类似
for ((初始值;循环控制条件;变量变化))
do
程序
done
#!/bin/bash
s=0
#从1加到100
for(( i=1;i<=100;i=i+1))
#定义循环100次
do
#每次循环给变量s赋值
s=$(($s+$i)) #第一种方式
s1=`expr $s + $i` #第二种方式
let s2+=i #第三种方式
done
#输出从1加到100的和
echo "The sum of 1+2+..+100 is : $s"
while循环
while 条件
do
程序
done
无限循环
#1
while :
do
command
done
#2
while true
do
command
done
#3
for (( ; ; ))
case语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
跳出循环
break #跳出整个循环
continue #跳出当前这个,进行下一个循环
函数
语法
#function可省略
[ function ] funname()
{
action;
[return int;]
}
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可
函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过$i的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
带有return语句的函数
- return返回状态码,并且可以自定义,范围为0-255
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
echo "两个数的和为:$(($aNum+$anotherNum))"
return 100
}
funWithReturn
echo "退出状态码: $? !"
获取函数的运算结果
- 若要获取函数结果的状态码,必须要在执行函数后马上使用$?才能获取调用函数的状态
- 若要获取函数结果,必须使用一个变量来接受结果,否则函数中的echo只是作为输出使用。弱使用了变量来接收结果,则echo为返回的值。
#!/bin/bash
funWithReturn(){
s=0
#求1-n的和,$1为传入的第一个参数
for(( i=1;i<=$1;i=i+1))
do
s=$(($s+$i))
done
#返回计算结果
echo $s
return 0;
}
#调用函数,并传入参数,求1-100的和
#result用户获取函数的返回结果,也就是echo后边的内容
result=$(funWithReturn 100)
echo "1-$1的和:$result"
#状态码为0表示正常退出,非0表示不正常退出(状态码范围:0-255)
echo "退出状态码: $? !"
数组
- 比较少用,参考资料
select
select表达式是bash的一种拓展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择
select var in ... ;
do
commond
done
.... now $var can be used ...
#select 是个无限循环,因此要记住用 break 命令退出循环,或用exit 命令终止脚本
#!/bin/bash
echo "What is your favourite OS?"
PS3="Please enter your choice:"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"
do
break;
done
echo "You have selected $var"
#这里PS3作为select语句的shell界面提示符,注意:PS3一定要定义在select语句的前面
#结果
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
Please enter your choice:3
You have selected Free BSD
#!/bin/bash
echo "你想学习什么语言?"
PS3="请输入你的选择:" # 设置提示字符串
select var in java c++ shell python
do
case $var in
"java")
echo "恭喜你选择成功.java最牛"
;;
"c++")
echo "驱动开发 网络优化 go 语言"
;;
"shell")
echo "运维必会"
;;
python)
echo "人工智能"
esac
break # 如果这里没有break 将会进行无限循环
done
echo "你选择的是:$var"
加载其他文件的变量
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
示例
定义两个文件 demo1.sh和demo2.sh,在test1中定义一个变量arr=(java c++ shell),在demo2中对arr进行循环打印输出。 第一步: vim demo1.sh
| #!/bin/bash
my_arr**=(AA BB CC)** |
---|
第二步: vim demo2.sh
| #!/bin/bash source **./**test1.sh # 加载test1.sh 的文件内容 for var in ${my_arr[*]} doecho $var
done |
---|
第三步: 执行demo2.sh
sh demo2.sh |
---|
集群环境准备
See Doc