跳转到内容

Shell编程

  • Linux高级、虚拟机、Linux命令、JDK&MYSQL安装
  • Shell编程、Shell脚本综合(JDK脚本安装、数据库定时备份脚本)
  • 集群环境准备
  • 解释型语言,不需要编译
  • shell的数据类型:字符串和整型
- 定义变量
Terminal window
username="znyoung" #不能使用空格,最好用双引号
- 访问变量
Terminal window
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
Terminal window
env #查看所有的系统变量
echo $PATH #输出环境变量PATH
export 变量名=变量值 #在/etc/profile后面追加
  • 执行shell脚本时,向脚本传递参数,可以用特殊变量来获取这些参数,以下示例:
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示*:$*";
Terminal window
./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} #字符
Terminal window
#表达式和算数运算符之间要有空格,完整的表达式要被``包含
#乘法运算需要加转义符\*
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 | 文件存在并且可执行 |

#判断当前系统是否有多个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
#判断是否成年
#!/bin/bash
read -p "please enter your age:" age
if [ $age -lt 18 ]
then
echo "您未成年"
elif [ $age -gt 18]
then
echo "您已经成年"
else
echo "您刚好成年”
fi
Terminal window
for 变量 in 值1 值2 值3…
do
程序
done
#打印/root目录下所有的文件
#!/bin/bash
for fileName in $(ls /root)
do
echo $fileName
done
Terminal window
#与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"
Terminal window
while 条件
do
程序
done
Terminal window
#1
while :
do
command
done
#2
while true
do
command
done
#3
for (( ; ; ))
Terminal window
casein
模式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
Terminal window
break #跳出整个循环
continue #跳出当前这个,进行下一个循环
Terminal window
#function可省略
[ function ] funname()
{
action;
[return int;]
}

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过i的形式来获取参数的值,例如,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返回状态码,并且可以自定义,范围为0-255
Terminal window
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表达式是bash的一种拓展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择

Terminal window
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 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Terminal window
. 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{my\_arr\[\*]} **do** **echo** **var** done | | --- |

第三步: 执行demo2.sh

| sh demo2.sh | | --- |

See Doc