Shell编程
相关博客:
- https://juejin.cn/post/6844903553119748109
- https://www.zhihu.com/tardis/zm/art/102176365
- https://juejin.cn/post/7143771422618779678
- https://juejin.cn/post/7130983293347954718
什么是Shell,相关资料:
SHELL
是 UNIX
系统的用户与操作系统之间的一种接口。它既是UNIX系统的命令解释程序,又是一种高级的命令程序设计语言。
作为命令解释程序,SHELL接收用户输入的命令,将命令翻译成一个动作序列,然后调用系统过程执行这条命令。
HelloWorld
创建名为 hello.sh
的脚本,将如下所有内容放进去(包括第一行注释)
#!/bin/bash
echo 'hello world!'
执行命令如下
# 方式1
sh hello.sh
# 方式2
chmod +x hello.sh
./hello.sh
chmod +x 和 chmod -x 命令
chmod +x 文件名
:授予执行权限chmod -x 文件名
:删除执行权限
使用 chmod +x
赋予执行权限的文件,使用 ls
命令查看时,该文件是绿色的,代表可执行文件
未被授予执行权限的文件,或使用 chmod -x
删除执行权限的文件,使用 ls
命令查看时,该文件是灰色的,代表只是个记录了内容的普通文件,类似于 .txt
或 .xml
文件
相关博客:
helloWorld示例说明
#!
告诉系统这个脚本需要什么解释器来执行。- 文件扩展名
.sh
不是强制要求的,可以没有文件后缀 方法1
:直接运行解释器,hello.sh
作为Shell 解释器
的参数。此时Shell 脚本
就不需要指定解释器信息,第一行可以不写。方法2
:hello.sh
作为可执行程序运行,Shell 脚本
第一行一定要指定解释器。
Shell 变量
Shell 变量分为 系统变量
和 自定义变量
。系统变量有$HOME
、$PWD
、$USER
等,显示当前 Shell 中所有变量:set
。
变量名可以由字母、数字、下划线组成,不能以数字开头。
基本语法
使用变量
:$变量名
输出环境变量echo $PATH
定义变量
:变量名=变量值
,等号两侧不能有空格,变量名一般习惯用大写。#!/bin/bash STR='HelloWorld' echo $STR
删除变量
:unset 变量名
。#!/bin/bash STR='HelloWorld' unset STR echo $STR
声明静态变量
:readonly 变量名
,静态变量不能删除。上述代码会报错:#!/bin/bash readonly STR='HelloWorld' unset STR echo $STR
testVar.sh: 第 3 行:unset: STR: 无法反设定: 只读 variable
将命令返回值赋给变量(重要)
#!/bin/bash
# 反引号,执行里面的命令
VARIABLE1=`ls`
# 等价于上句话
VARIABLE2=$(ls)
echo $VARIABLE1
echo $VARIABLE2
Shell 环境变量
/etc/profile
文件里面配置了环境变量,而这个文件里面的代码,是检索了 /etc/profile.d
文件夹下的 .sh
文件,并将检索到的环境变量整合之后,才生效的
所以,我们为了解耦,可以在 /etc/profile.d
目录下写一个自定义的 .sh
配置文件,然后再刷新 /etc/profile
文件,使配置生效
在 /etc/profile.d
文件夹下创建 my-env.sh
文件,写上如下内容
export MY_STR='Hello, environment variable'
保存退出后,使配置生效
source /etc/profile
然后测试环境变量是否生效
echo $MY_STR
位置参数变量
$n
:$0
代表命令本身、$1-$9
代表第1到9个参数,10以上参数用花括号,如${10}
。$*
:命令行中所有参数,且把所有参数看成一个整体。$@
:命令行中所有参数,且把每个参数区分对待。$#
:所有参数个数。
getParam.sh
脚本如下:
#!/bin/bash
echo $0 $1 $2
echo $*
echo $@
echo 参数个数=$#
保存退出,运行如下命令
chmod +x getParam.sh
./getParam.sh 10 20 30
运行结果如下
./getParam.sh 10 20
10 20 30
10 20 30
参数个数=3
预定义变量
在赋值定义之前,事先在 Shell 脚本
中直接引用的变量。
$$
:当前进程的 PID 进程号。$!
:后台运行的最后一个进程的 PID 进程号。$?
:最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
脚本如下
#!/bin/bash
echo 当前进程号=$$
# 在后台运行程序,该程序在文章上面
./hello.sh &
echo 最后一个进程的进程号=$!
# hello world!
echo 最后执行的命令结果=$?
结果运行一下就知道了
运算符
$((运算式))
或 $[运算式]
第三种写法如下
注意!expr
运算符间要有空格
expr m + n
,加法运算。expr m - n
,减法运算。expr \*
,/
,%
分别代表乘,除,取余
示例如下
#!/bin/bash
# 第一种方式,$((运算式))
echo $(((2 + 3) * 4))
# 第二种方式,$[运算式],推荐这种写法
echo $[(2 + 3) * 4]
# 第三种方式 expr
TMP=`expr 2 + 3`
echo `expr $TMP \* 4`
条件分支
if判断
注意,表达式的等号两边需要有空格
#!/usr/bin/env bash
a=1
b=2
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
case分支
case $1 in
"1")
echo 第一个参数是1
;;
"2")
echo 第一个参数是2
;;
*)
echo 第一个参数没匹配到对应值
;;
esac
循环结构
for循环
for ((i=0; i<5; i++)); do
echo "i="$i
done
while循环
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done