Shell编程
1、简介
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求,以便运行应用程序的界面系统级程序。
用户可以使用它来启动、挂起、停止甚至是编写一些程序。它是一种解释型脚本语言,可以直接调用Linux命令。
-----------------------------
| |
| --------------------- |
| | --------------- | |
| | | --------- | | |
| | | | 硬件 | | | |
| | | --------- | | |
| | | 内核 | | |
| | --------------- | |
| | Shell命令解释器 | |
| --------------------- |
| 外层应用程序 |
-----------------------------
2、屏幕输出命令
echo 输出的内容(不转义特殊字符)
echo -e 输出的内容(转义字符)
\t tab制表符
\n 换行
\r 回车
3、脚本格式
脚本的第一行必须以 #!/bin/bash开头
#!/bin/bash
echo "hello shell!"
4、执行脚本
需要先给脚本赋予可执行权限
chmod u+x 脚本名
再执行脚本文件(3种方式)
./脚本文件(相对路径)
/???/???/脚本文件(绝对路径)
sh 脚本文件(当前目录)
sh 脚本文件的绝对路径或相对路径
bash 脚本文件(当前目录)
bash 脚本文件的绝对路径或相对路径
5、变量
1)系统变量
$HOME 用户目录
$PWD 当前路径
$USER 查看当前用户名
$SHELL 查看bash命令所在路径
可以通过set命令查看所有的系统变量
2)自定义变量
[1] 声明变量
变量名=变量值
[2] 声明不可修改的静态变量
readonly 变量名=变量值
[3] 撤销变量
unset 变量名
[4] 使用变量
$变量名
[5] 提升为全局变量,供其他shell使用
export 变量名
[6] 注意事项
- 变量名一般由字母、数字和下划线组成,但不能以数字开头
- =左右不能有空格
- 变量名一般大写
3)变量的赋值
使用反引号 `表达式` (就是波浪线下面的符号,在数字1键的左边)
或者使用 $(表达式)
CURRENT_PATH=`date`
CURRENT_PATH=$(date)
4)位置参数变量
$0 表示执行shell的命令(会把sh 或 bash命令去掉)
$n 第n个参数(可以为1-9,如果是10及以上,则需要用大括号引起来)
$* 表示所有参数,并把它们当作一个整体
$@ 表示所有参数,但它们是互相独立的
$# 表示参数的个数
示例:
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$*"
echo "$@"
echo "$#"
执行:
./test.sh a 1
./test.sh
a
1
a 1
a 1
2
5)预定义变量
$$ 执行当前命令的PID
$! 最近后台执行的PID
#!/bin/bash
echo "$$"
#表示后台执行hello脚本
./hello.sh &
echo "$!"
6)字符串的拼接
直接将字符串无空格地连接即可
示例:
#!/bin/bash
a="abc"
b="123"
echo $a$b"汉字" #abc123汉字
7)将命令执行结果赋值给变量
使用变量名=`命令`即可,如果需要多个命令,则在每个命令结束时,加上分号即可
示例:
#!/bin/bash
result=`date; pwd`
echo $result
6、运算符
使用$[算数表达式] 或 $((算数表达式))
示例:
#!/bin/bash
A=$[ ((1 + 2) * 3 / 4) % 2 ]
echo $A
执行结果为:0
7、条件判断
使用[ 判断语句 ]
注意两端的空格
常用判断条件:
字符串1 = 字符串2 字符串是否相等
数值1 -eq 数值2 数值是否相等
数值1 -ne 数值2 数值是否不等
数值1 -lt 数值2 数值1是否小于数值2
数值1 -le 数值2 数值1是否小于等于数值2
数值1 -gt 数值2 数值1是否大于数值2
数值1 -ge 数值2 数值1是否大于等于数值2
-r 文件名 文件是否可读
-w 文件名 文件是否可写
-x 文件名 文件是否执行
-f 文件名 文件是否存在,并且是一个常规文件
-e 文件名 文件是否存在
-d 目录名 目录是否存在
8、流程控制
1)if判断
if [ 判断语句 ]
then
执行
fi
if [ 判断语句 ]
then
执行1
else
执行2
fi
if [ 判断语句 ]
then
执行1
elif [ 判断语句 ]
then
执行2
else
执行3
fi
示例:
#!/bin/bash
if [ $1 -gt 10 ]
then
echo "大于10"
elif [ $1 -ge 5 ]
then
echo "大于等于5"
fi
执行:
./test.sh 100
大于10
2)case判断
case 变量 in
“值1”)
执行1
;;
“值2”)
执行2
;;
*)
执行默认
;;
esac
示例:
#!/bin/bash
case $1 in
"1")
echo "一"
;;
"2")
echo "二"
;;
*)
echo "其它"
;;
esac
执行:
./test.sh 7
其它
3)for循环
for 变量名 in 值1 值2 … 值n
do
执行
done
for (( 初始值; 循环控制条件; 更新初始值 ))
do
执行
done
示例:
#!/bin/bash
for i in $*
do
echo $i
done
echo "---------"
for j in $@
do
echo $j
done
echo "---------"
sum=0
for (( k=1; k<=10; k++ ))
do
sum=$[ $sum + $k ]
done
echo $sum
执行:
./test.sh 1 2 3
1 2 3
---------
1
2
3
---------
55
4)while循环
while [ 判断语句 ]
do
执行
done
示例:
#!/bin/bash
i=1
sum=0
while [ $i -le 10 ]
do
sum=$[ $i + $sum ]
i=$[ $i + 1 ]
done
echo $sum
执行:
./test.sh
55
8、读取控制台输入命令
read 选项 保存输入值的变量名
-t 指定读取输入值的等待时长(单位秒,超时则退出等待)
-p 提示信息
9、路径命令
1)返回路径
dirname 文件路径
示例:
dirname /root/test.sh
/root
2)返回文件名
basename 文件路径
示例:
basename /root/test.sh
test.sh
10、函数
函数声明:
function 函数名()
{
函数体
return 返回值
}
函数执行:
函数名 参数1 参数2 … 参数n
获取返回值:
$?
注意:
- 函数声明的顺序需要早于函数执行
- return函数返回语句可以不写
- 函数返回值只能是整数,如果函数没有写返回语句,则获取到的函数返回值是0
示例:
#!/bin/bash
function calc()
{
local sum=0
sum=$[ $1 + $2 ]
return $sum
}
read -p "input a number:" n1
read -p "input another number:" n2
calc $n1 $n2
echo "result:"$?