Shell编程
、Shell编程
1、系统内核与Shell
·shell编程提供的是用户与操作系统kernal沟通的桥梁(广义的shell)
·shell是对kernal-API的包装,通过shell可以调用一切系统底层的功能
·图形用户界面也是一个shell应用程序
·Terminal也是一个shell应用程序(狭义的shell)
·shell脚本程序则是指系统自带的或自定义的运行在Terminal终端的程序,通常代码量不大
·运行在狭义shell(即终端)上的程序称为shell小程序,所使用的开发语言,即shell语言
·bash是最流行的shell脚本解释器,其它著名的解释器还有sh、zsh等
·扩展名是什么都行,文件是否可执行取决于【权限、内容、解释器】而非扩展名
2、编写Shell脚本
2.1 变量
整型、浮点型
字符串
拼接
"i am $name!"
"i am ${name}!"
长度
${#name}
切片
${name:0:3}
检索
index $name abc
注意:下标从1开始
2.2 数组
定义数组
arr=(a b c d)
arr[0]=a;arr[1]=b;arr[2]=c
访问元素
- ${arr[0]}
长度
全部元素长度:${#arr[*]}
全部元素长度:${#arr[@]}
单个元素长度:${#arr[0]}
2.3 环境变量
- 定义位置和作用范围
- 个别用户:家目录/.bashrc
- 全体用户:/etc/profile (访问前需要先source /etc/profile)
- 进程内有效:用户自定义的脚本中
- 定义环境变量:export MYNAME=”sname”
- 追加环境变量:export PATH=$PATH:”/home/sname/Desktop/”
- 使修改生效:source filename或reboot
- 不管环境变量定义在哪个文件中,只要进程或用户有source 它的权限,就能先source然后访问它的值
函数与参数
- 定义函数:funcname(){…}
- 调用函数:funcname
- 调用函数:funcname arg1 arg2 …
- $0 文件名
- 1, 1 , 2,$3… 传入的参数
- $# 参数长度
- $* 大参数串
- $@ 大参数数组
2.4 输入输出
read
read x;echo $x
read -p "input your pwd:" -s password -p(prompt)
在终端输出提示,-s(silent)安静模式终端不显示输入的字符
echo
echo "$a and text"
echo "expr ... and text"
echo content >> filename
echo -n "请输入你的名字:" 不换行输出
printf
printf "%d,%s,%10.2f" a b c
printf "%-d,%-s,%-10.2f" a b c 使用右对齐
printf "www.baidu.com\n"
2.5 运算符
算数运算符
- + - * / %
逻辑运算符
&&
||
!
关系运算符
-gt,-ge
-lt,-le
-eq,-ne
字符串运算符
[[ a = b ]]
[[ a != b ]]
[[ -z mstr ]] 判断字符串长度是否为0
[[ -n mstr ]] 判断字符串长度是否不为0
[[ mstr ]] 判断字符串是否存在
文件运算符
-d filename 判断是否文件夹
-f filename 判断是否普通文件(数据文件)
-r filename 判断是否可读
-w filename 判断是否可写
-x filename 判断是否可执行
-e filename 判断文件是否存在
2.7 程序关键字
unset a 释放变量
readonly a 将a设置为只读
let
- let c=$a+$b
- let "a++"
- let "a+=2"
expr
- a=`expr $a - 1`
2.8流程控制
if
if [[ ... ]];then ...;fi
if [[ ... ]];then ...;else ...;fi
if [[ ... ]];then ...;elif [[ ... ]];then ...;else ...;fi
for
for i in 1 2 3 do ... done
for (( i=1;i<10;i++ ))
while
while [[ $mint<=10 ]] do ... done
while read value do ... done
while true do ... done
until
until [[ $a -lt 1 ]] do ... done
case
case $level in A) echo "very good" ;; B) echo "not bad" ;; C)
echo "work harder" ;; esac
break,continue
2.9 脚本依赖
- source ./01hello.sh
3.0 案例
问候命令 hello
#!/bin/bash #↑声明shell解释器位置 word="Hello Shell" echo $word
数学计算命令 calc
#!/bin/bash # calc --add 3 4 执行结果为7 #第一个参数为--add时,做加法 if [[ $1 = "--add" ]];then echo --add echo $(($2+$3)) #第一个参数为--sub时,做减法 elif [[ $1 = "--sub" ]];then echo --sub echo $(($2-$3)) #第一个参数为--mul时,做乘法 elif [[ $1 = "--mul" ]];then echo --mul echo $(($2*$3)) #第一个参数为--div时,做除法 elif [[ $1 = "--div" ]];then echo --div echo $(($2/$3)) #第一个参数为--div时,做求余 elif [[ $1 = "--mod" ]];then echo --mod echo $(($2%$3)) #第一个参数为其它时,提示错误 else echo $1 echo fuck off,不支持的操作符 fi
显示文件信息 fileinfo
#!/bin/bash #fileinfo ~/hello 显示该文件的权限和内容 fileinfo(){ # 如果文件不存在,报错退出 if [[ ! -e $1 ]];then echo "$1 doesn't exist!" return 0 fi echo $1: #判断和输出文件的读写执行权限 if [[ -r $1 ]];then echo -n "readable," else echo -n "NOT-readble," fi if [[ -w $1 ]];then echo -n "writable," else echo -n "NOT-writable," fi if [[ -x $1 ]];then echo "executable" else echo "NOT-executable" fi #通过Linux的标准命令,输出文件内容 echo -e "\ncontents": echo ==================== cat $1 echo ==================== } # 调用函数,传入文件位置参数 fileinfo $1
拷贝内容 mycp
#!/bin/bash #用户通过mcp srcfile dstfile实现拷贝 #通过mcp -a srcfile dstfile实现追加 #拷贝完成后询问用户是否立即查看 docp(){ #判断是新建还是追加 append=0 if [[ $1 = "-a" ]];then append=1 srcfile=$2 dstfile=$3 else append=0 srcfile=$1 dstfile=$2 fi echo "srcfile:$srcfile,dstfile:$dstfile" #判断源文件是否存在 if [[ ! -e $srcfile ]];then echo "stupid! souce file does not exist!" return 0 fi #如果目标文件不存在则创建 if [[ ! -e $dstfile ]];then touch $dstfile fi #写入文件 if [[ $append -eq 1 ]];then cat < $srcfile >> $dstfile else cat < $srcfile > $dstfile fi #询问用户是否要查看目标文件 echo -n "$srcfile written to $dstfile successfully! read it now?[y/n]:" read temp if [[ $temp = 'y' ]];then echo "content:" echo ==================== cat < $dstfile echo ==================== fi } #调用函数,传入参数 docp $1 $2 $3
猜数字游戏 guessnum
#!/bin/bash
#生成随机数,此处的rand命令需要安装一下
answer=`rand --max 1000`
#answer=$(cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}')
#answer=$(($answer%1000))
echo $answer
while true
do
#提示用户输入
echo -n "please enter a num between 0~1000:"
read guess
#看答案
if [[ $guess = "drop it" ]];then
echo "the answer is:$answer"
break
fi
#对比
if [[ $guess -eq $answer ]];then
echo "bingo!the answer is:$answer"
break
elif [[ $guess -gt $answer ]];then
echo "too big!"
else
echo "too small!"
fi
done
echo "GAME OVER!"
转载自:https://blog.csdn.net/u010986776/article/details/79911659