一:什么是shell
shell是用户与linux内核交互的外壳,通过暴露外部方法(如 list),来达到人机交互。
shell的编程是一种脚本编程,面向命令编程,最常用的解释器为bash解释器。
shell可以python代替,shell和python各有优缺点。
![a4847600f491895b6610fa989c08c39b.png](https://i-blog.csdnimg.cn/blog_migrate/4437d787bb007c02bf6edaaef5a2df84.png)
![e26d807f577035e29895b3158caef939.png](https://i-blog.csdnimg.cn/blog_migrate/cf41d06f88d1c633df9c1fe2005ec0e7.png)
二:Hello World
vi demo #并添加以下内容
#!/usr/bin/bash
echo "hello World"
#!/usr/bin/bash 这句话表明这个文本是shell脚本(记住就可以了,就是一种统一的规范)
chmod 777 ./demo
./demo
![645cdb9ba024a8f31635b2b4d566e0e0.png](https://i-blog.csdnimg.cn/blog_migrate/0a17a6e526644a0ca16deac47e698d20.png)
若不添加第一行的说明,则需要。
bash ./demo
echo 为打印到控制台作用,验证如下。
![bffc935ae671bce8b994015d47cb1548.png](https://i-blog.csdnimg.cn/blog_migrate/c8a760c91ee119cc7c841f8a454291c6.jpeg)
三:了解$的用法和参数定义
参数定义
var=value
#撤销声明
unset var
#查看已经声明的变量
set
一个$是取值的意思,例如
#!/usr/bin/bash
a="myVar"
echo $a
![db3d7b20618ebf192288e2d81fb7bd75.png](https://i-blog.csdnimg.cn/blog_migrate/1675546e3e9ddfb8291be8567e0d7fed.png)
两个$$是取得当前进程PID
#!/usr/bin/bash
a=$$
echo $a
![9aac66dd36c314b03ba53e4713603415.png](https://i-blog.csdnimg.cn/blog_migrate/433437c6a2f759be1f264af8d22cf64d.png)
$#(获取参数个数),$1(获取第一个参数)
#!/usr/bin/bash
echo $#
echo $1
echo $4
echo ${4}Append
![2764f16e6444785e7b5a72615cae77fe.png](https://i-blog.csdnimg.cn/blog_migrate/38709d6850a801f702017e1513e99e5f.jpeg)
$?(获取上次命令的执行结果),非0表示错误,为0表示执行成功
$(shell cmd),获取括号内的shell命令的结果,注意`shell cmd
` 同样的效果。
#!/usr/bin/bash
files=$(ls -l | wc -l)
lines=`ls -l | wc -l`
echo $?
echo $lines
echo $files
![d5d360ec59b6e7b5aa55945f77a45049.png](https://i-blog.csdnimg.cn/blog_migrate/3bfcb09d9259b00bf20085bf01829009.jpeg)
四:表达式
运算符
expr + , - , *, /, %
Let的用法,(( ))的用法
a=1
b=2
let c=$a+$b
d=$((a+b))
echo $c $d
中括号的用法(-lt = <)
[ 3 -lt 8 ] && echo "is true"
条件判断
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
-n 判断是否为空
[-z string] “string”的长度为零则为真
举个例子
#!/bin/bash
if [ -n $1 ] ; then
echo "有参数输入"
else
echo "没有参数输入"
fi
接受输入
read -t [等待输入的秒数] -p [提示符] [想要保存到的参数名]
举个例子,10秒内输入名字
#!/bin/bash
read -t 10 -p "输入你的名字" NAME
echo $NAME
五:流程控制
举个if的例子
if ls / &> /dev/null ; then
echo ok
else
echo no ok
fi
更加详细的 help if
举个for的例子
for(( i=0;i<10;i++ ))
do
echo $i
done
#集合for
for i in 1 2 3 4
do
echo $i
done
举个 while
while ls /etc;
do
echo ok
done
类似switch的case用法
a=1
case $a in
1) echo "this is 1"
;;
2) echo "this is 2"
;;
esac
六:自定义函数
自定义函数
function 函数名()
{
函数逻辑
}
函数返回值为最后一行的执行结果,举个例子
$!/bin/bash
function sum()
{
expr $1 + $2
}
read -p "输入第一个数字” n1
read -p "输入第二个数字" n2
sum $n1 $n2
#在终端调用,输入 1 2
七:总结
shell很容易上手,学习完基本概念和help的用法后,多找找练习题,或者看看别人写的bash脚本即可熟练掌握。
更加全面的指南。
另外idea和vscode也有许多shell自动补全的插件。
如果你使用vscode本地编辑远程主机bash文件的话,配置bash的插件,那么对比使用vi 编辑调试shell脚本,效率会大大提升,笔者很推荐大家使用vscode远程开发模式。