Shell编程详细教程:从基础语法到实践
目录
shell是什么
shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
快速入门
- 脚本以 #!/bin/bash 开头:告诉解释器以bash来解析脚本;
编写myshell.sh文件:
#!/bin/bash
echo "This my first shell script"
给脚本添加执行权限
chmod +x myshell.sh
shell变量
- 变量分类:
1.自定义变量:A="Hello World"等等;
2.系统变量:$HOME、$PWD、$SHELL、$USER 等等;
- 自定义变量:
1.定义变量:变量=值 注意:等号两边没有空格;
2.引用变量:$变量 或者 ${变量}
3.撤销变量:unset 变量
4.生命静态变量readonly:readonly 变量 注意:静态变量不能unset;
演示:
my_shell="hello"
echo "mys_shell=${my_shell}"
unset my_shell
echo "mys_shell=${my_shell}"
- 将命令的返回值赋给变量
1.变量名=`命令`:运行反引号里面的命令,并将结果赋值给变量;
2.变量名=$(命令):反引号可以用$代替
演示:
RESULT=`ls -la`
echo "RESULT=${RESULT}"
echo ""
MY_DATE=$(date)
echo "MY_DATE=${MY_DATE}"
设置环境变量
1.export 变量名=变量值 (功能描述:将shell变量输出为环境变量);
2.source 配置文件 (功能描述:让修改后的配置信息立即生效);
3.echo $变量名 (功能描述:查询环境变量的值);
位置参数变量
作用:当我们执行一个shell脚本时,如果想要获取到命令行的参数信息,就可以使用位置参数变量;
语法:
1.$n:(功能描述:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十 以上的参数需要用大括号包含,如${10});
2.$*:(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体);
3.$@:(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待);
4.$#:(功能描述:这个变量代表命令行中所有参数的个数);
演示:
echo "输入的命令是:$0;参数是: $1 $2"
echo "输入的命令行中的所有参数:$*"
echo "输入的命令行的所有参数:$@"
echo "输入的命令行的参数个数:$#"
预定义变量
介绍:shell设计者预先定义好的变量,可以直接在shell脚本中使用;
语法:
1.$$: (功能描述:当前进程的进程号(PID));
2.$!: (功能描述:后台运行的最后一个进程的进程号(PID));
3.$?:(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令 执行不正确了。)
运算符
1."$((运算式))" 或 "$[运算式]";
2.expr m + n:加法 注意:expr运算符间要有空格,并且整条语句要在反引号内;
3.expr m - n:减法
4.expr \*, /, %:乘 除 取余;
演示:
RESULT=$(((3+2)*3))
echo "(3+2)*3=${RESULT}"
TEMP=`expr 2 + 4`
echo "TEMP=${TEMP}"
NUM=`expr ${TEMP} / 2`
echo "TEMP/2=${NUM}"
条件判断
- 整数比较:
操作符 | 作用 |
= | 比较两个字符串 |
-lt | 小于 |
-le | 小于等于 |
-eq | 等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
- 按照文件权限比较
操作符 | 作用 |
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
- 按照文件类型比较
操作符 | 作用 |
-f | 文件存在并且是一个常规文件 |
-e | 文件存在 |
-d | 文件存在并且是一个目录 |
IO流程控制
- if判断
语法: if [ 条件判断式 ]
then 程序
elif [ 条件判断式 ]
then 程序
fi
注意:[ 条件判断式 ],中括号与条件判断式之间必须与空格;
练习:编写一个shell程序,如果输入的参数,大于等于60,则输出及格,如果小于60则输出不及格;
f [ $1 -ge 60 ]
then echo "及格了"
elif [ $1 -lt 60 ]
then echo "不及格"
fi
- case语句
语法:case $变量名 in
'"值1")
执行程序1;;
'"值2")
执行程序2;;
*)
以上值都不是执行此程序;;
esac
练习:当命令行参数是 1 时,输出 "周一", 是 2 时,就输出"周二", 其它情况输出"other";
case $1 in
"1")
echo "周一";;
"2")
echo "周二";;
*)
echo "others";;
esac
- for循环
语法1:for 变量 in 值1 值2 值3....
do
程序
done
练习:打印命令行输入的参数【会使用到$* $@】;
# 使用 $*
for i in "$*"
do
echo "the nums are $i"
done
echo "====================="
# 使用 $@
INDEX=0
for j in "$@"
do
INDEX=$[$INDEX + 1]
echo "the num of $INDEX is $j"
done
语法2:for ((初始值;循环控制条件;变量变化))
do
程序
done
练习:从1加到100的值输出显示;
SUM=0;
for((i=1;i<=100;i++))
do
SUM=$[$SUM + $i]
done
echo "从1加到100的和为:$SUM"
- while循环
语法: while [条件判断式]
do
程序
done
练习:从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
#i=$[$i+1]
i=$[$i + 1]
done
echo "从1加到$1的总和为:$SUM"
read读取控制台输入
语法:read(选项)(参数)
选项:-p:指定读取时的提示符;
-t:指定读取时等待的时间(秒),如果没有在指定的时间内输入,就不在等待;
参数: 变量,指定读取的变量名,将读取到的内容赋值给变量;
练习:读取控制台输入的一个num值;
# !/bin/bash
# 从控制台读取输入内容
read -t 5 -p "请输入一个数字num:" NUM1
echo "您输入的数字为:$NUM1"
函数
- 系统函数
basename: 返回完整路径最后 / 的部分,常用于获取文件名;
basename [pathname] [suffix]:功能描述:basename 命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 中的 suffix 去掉。
dirname: 返回完整路径最后 / 的前面的部分,常用于返回路径部分;
dirname 文件绝对路径:功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。
- 自定义函数
语法:
function functionname(){
action;
}
方法调用:直接写函数名:functionname 参数
练习:计算输入两个参数的和;
function getSumFromInput(){
SUM=$[$n1 + $n2]
echo "输入参数的和为:$SUM"
}
read -p "请输入一个数值:" n1
read -p "请输入一个数值:" n2
getSumFromInput $n1 $n2
看到这里shell的语法和知识点差不多已经全部学完了,剩下的就是不断的实践练习,唯有不断练习方能得心应手,提高工作效,come on~~
更多推荐
所有评论(0)