Linux Shell 快速入门
本文主要介绍 Linux Shell 编程相关基础知识,可以让初学者快速入门,内容主要包含以下几个方面:
Shell 脚本概述 Shell 脚本运行与调试 Shell 如何定义变量 Shell 表达式 Shell 流程控制 Shell 函数
Shell 脚本概述
Shell 脚本是一门简单的脚本语言,主要由 Shell 基本语法 + Linux 命令 组成,所以说要写好 Shell 脚本,必须掌握好一些重要的 Linux 命令。
下面是一个最简单的 Shell 脚本内容,我们可以将其保存在一个test.sh 文件中
#!/bin/bash
# This is a output string `https://dev4mobiles.com`
echo "https://dev4mobiles.com"
第一行 #! 是约定标记,英文读作shell bang,后面的 /bin/bash 指定了脚本需要哪种解释器来解释, 本文使用了常用 bash 解释器。
第二行 以 # 开头的行就是注释,会被解释器忽略
第三行 功能是向命令行输出字符串,字符串一般用双引号引起来
Shell 运行与调试
Shell 脚本的执行是解释执行的,也就是说边解释边执行
运行
运行方式有两种:
- 作为可执行程序
chmod u+x test.sh
./test.sh
首先需要给文件 test.sh 添加可执行权限,然后执行 ./test.sh 就可以得到输出结果, 其中的 . 是标识在当前目录找可行性程序 test.sh 来执行,并且使用定义的 shell bang #!/bin/bash 来执行程序
- 作为解释器参数来执行, 可以使用解释器
sh, 或者其它解释器bash, 使用这样的方式来执行程序,其中指定的shell bang是不生效的
sh test.sh
bash test.sh
作为解释器参数来执行脚本,不需要可执行性权限,所以这种方式也是使用最多的
调试
一般常用的有两个:
- 检查语法命令
sh -n test.sh, 没有输出,说明没有语法错误 - 调试命令
sh -x test.sh下面是执行sh -x test.sh的结果
+ echo https://dev4mobiles.com
https://dev4mobiles.com
第一行 带+ 表明调试器真正执行的命令,不带 + 的是我们的程序输出, 所以结果 https://dev4mobiles.com 是命令 echo "https://dev4mobiles.com" 的输出
如何定义变量
下面来看一段程序,程序表明了如何定义程序
#!/bin/bash
name='dev4mobile'
age=20
website="dev4mobiles.com, name=${name}"
money=10.2
echo $name $age $website $money
echo "$name $age"
arr=(1 2 3)
echo "${arr[@]}"
程序说明:
第一行:指定了解释器为 /bain/bash
第二行:定义一个变量为 name,值为一个用单引号引起来的字符串
第三行:定义一个整形变量 age, 值为 20
第四行:定义一个用双引号引起来的字符串website, 双引号里面的字符串可以通过${} 的方式引用其它变量,这里引用了 name 字段,
但是像第一行用单引号定义的字符串里面不可以引用其它字符串,所以双引号可以拼接字符串
第五行:定义了一个浮点数
第六行:使用 echo 输出多个变量, 变量以空格分开
第七行:输出用双引号拼接的多个字符串
第八行:定义一个名为 arr 的数组
第九行:输出数组
执行 bash test.sh, 将会输出结果
dev4mobile 20 dev4mobiles.com, name=dev4mobile 10.2
dev4mobile 20
1 2 3
变量分为自定义变量和环境变量,上面的程序就是自定义变量,还有一种环境变量,是系统已经定义好的,我们直接拿来使用就行了
#!/bin/bash
echo "\$PWD=$PWD"
echo "\$TERM=$TERM"
echo "\$HOME=$HOME"
echo "\$PATH=$PATH"
为了不让${} 解析成变量, 我使用 \ 进行转义
Output:
$PWD=/home/dev4mobile/data
$TERM=xterm-256color
$HOME=/home/dev4mobile
$PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Shell 表达式
#赋值表达式
var=5
#表达式计算
expr $var + 5
#测试 var 是否与 5 相等
test $var -eq 5
#测试 var 变量 是否与 5 相等的另外一种写法
[ $var -eq 5 ], 记住[] 里面的内容必须以空格开始,空格结束
#测试develop文件是否为目录
test -d ./develop
注意上面的脚本不能直接拷贝来运行,需要配合其它表达式来执行
Shell 流程控制
if 流程
#!/bin/bash read Name if test "$Name" = "dev4mobile";then echo "true" else echo "false" fi执行
bash test.sh注意:字符串相等使用=且等号左右两边必须包含空格, 不然的话,解释执行会报错case 语句
#!/bin/bash
read Animal
case $Animal in
"pig")
echo "pig"
;;
"beef")
echo "beef"
;;
*)
echo "default"
;;
esac
- for 循环 两种写法 第一种写法
#!/bin/bash
for((var=1; var<10; var++));do
echo $var
done
第二种写法
#!/bin/bash
for var in `ls -al`;do
echo $var
done
其中 `ls -al` 是执行 ls -al 命令
- while 循环
#!/bin/bash
read NUM
while [ $NUM -lt 10 ]; do
echo $NUM
NUM=$(($NUM+1))
done
条件放在用[] 中,注意里面的条件必须左右都有空格,不然解析会报错,另外 $(()) 里面存放的是算术表达式
- until
#!/bin/bash
set -e
Num=0
until [ $Num -gt 5 ];do
echo $Num
Num=$[Num+1]
done
条件跟while一样,放在 [] 里面,另外除了可以使用 $(()),也可以使用 $[] 里面使用算术表达式
- break
#!/bin/bash
for num in 1 2 3;do
if test $num -gt 2;then
break
fi
echo $num
done
- contine
#!/bin/bash
for num in 1 2 3;do
if test $num -eq 2;then
continue
fi
echo $num
done
Shell 函数
定义函数有格式
[function] fun_name() {
[return xxx]
}
其中[] 中的内容是可以省略的
#!/bin/bash
#定义函数
function print(){
echo "https://dev4mobiles.com"
}
#调用函数
print
#定义带参数的函数
say(){
echo $1 $2
#只能返回数字且范围为0~255
return 2
}
say 1 2
# 得到函数的返回值
echo $?
⚠️不能在函数 () 定义参数, 方法内接收参数 $1, $2 格式来接收参数
调用方法使用方法名后跟参数
只能立刻使用 $? 来得到结果,其中方法返回的参数只能是0~255之间的值(很奇葩,不知道为啥设计成这样)
总结
看过上面的教程,相信差不多能够入门了,剩下来的就是花时间多练习,相信你会成为 shell 脚本专家