shell 编程
文章目录
shell 基础
1 shell 是什么?
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
2 shell 脚本的执行方式
2.1 第一个shell脚本
shell脚本在控制台上输出hello world:
1、创建文件test.sh(注:shell脚本的扩展名并不影响脚本执行);
2、在文件中输入内容:
#!/bin/bash #告诉系统这个脚本用什么解释器执行
echo "hello world" #echo 命令用于想窗口输出文本
shell脚本运行方法:
1、设置为可执行程序:
chmod +x ./test.sh #给予可执行权限
./test.sh #执行脚本
2、作为解释器参数执行:
/bin/sh test.sh
sh test.sh
#若使用第二种方法可以不在脚本第一行加入#!/bin/bash
2.2 shell 变量
shell 变量介绍:
1、 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2)、环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3)、shell变量:shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
自定义变量
#!/bin/bash
myName="haitun" #自定义变量myName
echo myName=$myName #使用"$"符号调用变量
unset myName #使用unset删除变量
echo myName=$myName
#多行注释的方法:
:<<!
输出结果:
myName=haitun
myName=
!
只读变量
1、使用readonly
命令可以设置只读变量,只读变量的值不能修改;
2、不能使用unset
删除只读变量;
#!/bin/bash
myName="haitun"
readonly myName #只读变量的值不能被修改
echo myName=$myName
命令的返回值赋给变量
#!/bin/bash
RESULT=`ls -l ./` #1、使用 ` ` 将命令扩起来进行赋值
echo $RESULT
echo " "
MY_DATE=$(date) #2、使用 $() 小括号括起来进行赋值
echo date=$MY_DATE
设置环境变量
环境变量: 系统中所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
设置环境变量:
1、export 变量名=变量值 (将shell变量输出为环境变量);
2、source 配置文件 (让修改后的配置信息立即生效);
3、echo $变量名 (查询环境变量);
#新建文件test.sh进行操作
#!/bin/pbash
export AA="haitun" #设置环境变量"AA"的值为"haitun";
echo AA #输出环境变量
#然后保存退出test.sh
#然后在命令行中输入 : source test.sh
#然后AA就设置为了环境变量,此时可以直接在命令行中输入 : echo $AA ,可以得到输出结果为:"haitun"
shell 传递参数
可以在执行脚本时向脚本内传递参数;
$ ./test2.sh
#!/bin/bash
echo "shell 传递参数"
echo "执行的文件名:$0"
echo "第一个参数为:$1"
echo "第二个参数为:$2"
echo "第三个参数为:$3"
$ chmod +x test2.sh
$ ./test2.sh
$ ./test2.sh 11 22 33
:<<!
#输出结果:
shell 传递参数
执行的文件名:./test2.sh
第一个参数为:11
第二个参数为:22
第三个参数为:33
!
参数 | 说明 |
---|---|
$n | n代表一个数字,$0为执行的文件名(包括文件路径),$1表示执行脚本的第一个参数,$2表示执行脚本的第二个参数; |
$# | 传递到脚本的参数个数 |
$* | 以一个字符串显示所有向脚本传递的参数;如果是 “ [$*] ”的情况,则为"$1 $2 … $n"的形式输出所有参数。 |
$@ | 与 ∗ 相同,但是使用时加引号,并在引号中返回每个参数。如 " [ *相同,但是使用时加引号,并在引号中返回每个参数。如" [ ∗相同,但是使用时加引号,并在引号中返回每个参数。如"[@]“用「”」的情况,则为以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
|$?|显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。|
#!/bin/bash
echo "传递到脚本的参数个数为:$#"
echo "\$*输出:"
for i in "$*"; do
echo $i
done
echo "\$@输出:"
for i in "$@"; do
echo $i
done
$ ./myAdd.sh 1 2 4
:<<!
传递到脚本的参数个数为:3
$*输出:
1 2 4
$@输出:
1
2
4
!
3 shell 运算符
基本语法:
1、“$((运算式))” 或 “$[运算式]”;
2、expr x + y ;
#!/bin/bash
A=$1
B=$2
echo "A+B=$(($A+$B))"
echo "A-B=$[$A-$B]"
echo "A*B=`expr $A \* $B`" #使用expr时要用``把表达式引起来,并且对于“乘法运算符”要使用转义字符\
$./test.sh 4 2
A+B=6
A-B=2
A*B=8
4 条件判断
基本语法: 使用时用将表达式放入 [] 内,例如[ a -lt b ],如果表达式为真则返回true否则返回false
判断语句:
1 两个整数比较
字符串判断语句 | 说明 |
---|---|
= | 字符串比较 |
-lt | 小于 |
-le | 小于等于 |
-gt | 大于 |
-ge | 大于等于 |
-ne | 不等于 |
2 判断文件权限
文件权限判断语句 | 说明 |
---|---|
-r | 有读的权限 |
-w | 有写的权限 |
-x | 有执行的权限 |
3 文件类型判断
文件类型判断语句 | 说明 |
---|---|
-f | 文件存在且是一个常规的文件 |
-e | 文件存在 |
-d | 文件是一个目录 |
#!/bin/bash
echo "条件判断语句:"
a=11
b=12
if [ $a -lt $b ]
then
echo "a<b"
else
echo "a>b"
fi
5 流程控制
if判断
#方法 1:
if [ 条件判断式 ]
then
运行程序
else
运行程序
fi
case语句
#!/bin/bash
echo "case语句,当命令参数为1时,输出“周一”,参数为2时,输出“周二”,其他情况输出other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for 循环
#!/bin/bash
#for循环打印所有输入参数
for i in $*
do
echo $i
done
#for循环累加1~10
SUN=0
for ((i=1;i<=10;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM
~
while 循环
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
6 read读取控制台输入
语法:read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:读取值时的等待时间
**参数:**指定读取值的变量名;
#!/bin/bash
#在控制台中输入一个值并打印
read -p "请输入一个数 num=" NUM
echo "你输入的值为:" $NUM
#10s内在控制台中输入一个数
read -t 10 -p "请在10s内输入" NUM2
echo "你输入的值为:" $NUM2