数据来源:拉钩教育大数据高薪开发训练营
Linux的shell编程
Shell 是⼀个⽤ C 语⾔编写的程序, 通过 Shell ⽤户可以访问操作系统内核 服务。它类似于 DOS 下的command 和后来的 cmd.exe。Shell 既是⼀种命令语⾔,⼜是⼀种程序设计语⾔。 Shell script 是⼀种为 Shell 编写的脚本程序。 Shell 编程⼀般指 Shell 脚本编程,不是指开发 Shell ⾃身。 Shell 编程跟java、 php 编程⼀样,只要有⼀个能编写代码的⽂本编辑器 和⼀个能解释执⾏的脚本解释器就可以了。 Linux 的 Shell 种类众多, ⼀个系统可以存在多个 Shell,可以通过 cat /etc/shells 命令查看系统中安装的 Shell。 Bash 由于易⽤和免费,在⽇常⼯作中被⼴泛使⽤。同时, Bash 也是⼤多数 Linux 系统默认的 Shell。
第一节 基本格式
使⽤ vi 编辑器新建⼀个⽂件 hello.sh。 扩展名并不影响脚本执⾏,⻅名知 意。 ⽐如⽤ php 写 Shell 脚本,扩展名就⽤ .php。
#!/bin/bash
echo "Hello World !"
”!“是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。 echo 命令⽤于向窗⼝输出⽂本。 Shell 脚本的执⾏: chmod +x ./hello.sh #使脚本具有执⾏权限 ./hello.sh #执⾏脚本 直接写 hello.sh, Linux系统会去PATH⾥寻找有没有叫 hello.sh的。 ⽤./hello.sh 告诉系统说,就在当前⽬录找。 还可以作为解释器参数运⾏。 直接运⾏解释器,其参数就是Shell 脚 本的⽂件名,如: /bin/sh /root/hello.sh /bin/php test.php 这种⽅式运⾏脚本,不需要在第⼀⾏指定解释器信息,写了也不⽣效。
第二节 shell变量
1.语法格式
变量=值,如: your_name=“itcast.cn” 注意:变量名和等号之间不能有空格,同时,变量名的命名须遵循如下规则: ⾸个字符必须为字⺟( a-z, A-Z) 中间不能有空格,可以使⽤下划线(_) 不能使⽤标点符号 不能使⽤ bash ⾥的关键字(可⽤ help 命令查看保留关键字)
2.变量使⽤
使⽤⼀个定义过的变量,只要在变量名前⾯加 $ 即可。
your_name=“itcast.cn”
echo $your_name
echo ${your_name}
花括号是可选的,加不加都⾏,加花括号是为了帮助解释器识别变量的边界。
已定义的变量,可以被重新定义。
使⽤ readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
使⽤ unset 命令可以删除变量。 不能删除只读变量。
readonly variable_name
unset variable_name
3.变量类型
局部变量 :
局部变量在脚本或命令中定义,仅在当前 Shell 实例中有效,其他 Shell 启动的程序不能访问局部变量。
环境变量 :
所有的程序,包括 Shell 启动的程序,都能访问环境变量,有些程
序需要环境变量来保证其正常运⾏。 可以⽤过 set 命令查看当前环境变量。
Shell 变量 :
Shell 变量是由 Shell 程序设置的特殊变量。 Shell 变量中有⼀部分是环境变量,有⼀部分是局部变量,这些变量保证了 Shell 的正常运⾏。
4.参数传递
在执⾏ Shell 脚本时, 可以向脚本传递参数。
脚本内获取参数的格式为: $n。 n 代表⼀个数字, 1 为执⾏脚本的第⼀个参
数, 2 为执⾏脚本的第⼆个参数,以此类推…… $0 表示当前脚本名称。
5.特殊字符
$# 传递到脚本的参数个数
$* 以⼀个单字符串显示所有向脚本传递的参数。
$$ 脚本运⾏的当前进程 ID 号。
$! 后台运⾏的最后⼀个进程的 ID 号。
@
与
@ 与
@与相同,但是使⽤时加引号,并在引号中返回每个参数。
$? 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。
例⼦:
#!/bin/bash
echo “第⼀个参数为: $1”;
echo “参数个数为: $#”;
echo "传递的参数作为⼀个字符串显示: $";
执⾏脚本: ./test.sh 1 2 3;
$* 、 $@的区别
相同点: 都表示传递给脚本的所有参数。
不同点:
不被"“包含时,
∗
和
*和
∗和@都以$1 $2…
n
的
形
式
组
成
参
数
列
表
。
被
"
"
包
含
时
,
"
n 的形式组成参数列表。 被" "包含时, "
n的形式组成参数列表。被""包含时,"*” 会将所有的参数作为⼀个整体,以"$1 $2 …
n
"
的
形
式
组
成
⼀
个
整
串
;
"
n"的形式组成⼀个整串; "
n"的形式组成⼀个整串;"@" 会将各个参数分开,以"$1" “
2
"
…
"
2" … "
2"…"n” 的
形式组成⼀个参数列表。
‘’、""的区别
''特殊字符不替换
""特殊字符替换
6.Shell 运算符
Shell 和其他编程语⾳⼀样,⽀持包括:算术、关系、 布尔、字符串等运
算符。 原⽣ bash 不⽀持简单的数学运算,但是可以通过其他命令来实现,例如
expr。 expr 是⼀款表达式计算⼯具,使⽤它能完成表达式的求值操作。例如加,减,乘,除等操作
注意:表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
完整的表达式要被 ``包含,注意不是单引号,在 Esc 键下边。
例如,以下表示⼀些数据的运算
#!/bin/bash
echo “hello world”
a=4
b=20
#加法运算
echo expr $a + $b
#减法运算
echo expr $b - $a
#乘法运算,注意*号前⾯需要反斜杠
echo expr $a \* $b
#除法运算
echo expr $b / $a
注意:
此外,还可以通过(())、 $[]进⾏算术运算。
count=1
((count++))
echo
c
o
u
n
t
a
=
count a=
counta=((1+2))
a=$[1+2]
第三节流程控制
1.if else语句
if condition1 then command1 elif condition2 then command2 else commandN fi
条件表达式写法
EQ 就是 EQUAL等于
NQ 就是 NOT EQUAL不等于
GT 就是 GREATER THAN⼤于
LT 就是 LESS THAN⼩于
GE 就是 GREATER THAN OR EQUAL ⼤于等于
LE 就是 LESS THAN OR EQUAL ⼩于等于
注意:与expr一样,[ ]中表达式和运算符之间要有空格
#!/bin/bash
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a ⼤于 b"
else
echo "$a -gt $b: a 不⼤于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a ⼩于 b"
else
echo "$a -lt $b: a 不⼩于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a ⼤于或等于 b"
else
echo "$a -ge $b: a ⼩于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a ⼩于或等于 b"
else
echo "$a -le $b: a ⼤于 b"
fi
2.for循环
⽅式⼀
for N in 1 2 3
do
echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
⽅式⼆
for ((i = 0; i <= 5; i++))
do
echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
需求:使⽤for循环打印数字以及当前系统所有进程
#!/bin/bash
#循环打印 1 2 3这三个数字
for N in 1 2 3
do
echo $N
done
a=1
b=2
c=3
for N in $a $b $c
do
echo $N
done
打印当前系统所有进程
``:反引号,调用shell命令
#
for N in `ps -ef`
do
echo $N
done
2.while语法
⽅式⼀
while expression
do
command
…
done
⽅式⼆
#!/bin/bash
i=1
while (( i <= 3))
do
let i++
echo $i
done
let 命令是 BASH 中⽤于计算的⼯具,⽤于执⾏⼀个或多个表达式,变量
计算中不需要加上 $ 来表示变量。 ⾃加操作: let no++ ⾃减操作: let no—
⽅式三: ⽆限循环
while true
do
command
done
3.case语句
case 值 in
模式 1)
command1
command2
...
commandN
;;
模式 2)
command1
command2
...
commandN
;;
esac
使⽤case语句实现交互会话
#!/bin/bash
echo '输⼊ 1 到 4 之间的数字:'
echo '你输⼊的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输⼊ 1 到 4 之间的数字'
;;
esac
第四节 函数使用
所有函数在使⽤前必须定义。这意味着必须将函数放在脚本开始部分,直⾄
Shell 解释器⾸次发现它时,才可以使⽤。 调⽤函数仅使⽤其函数名即可。
[ function ] funname [()]
{
action;
[return int;]
}
1、可以带 function fun()定义,也可以直接 fun() 定义,不带任何参数。
2、参数返回,可以显示加 return ,如果不加,将以最后⼀条命令运⾏结
果,作为返回值。 return 后跟数值 n(0-255)。
1.函数参数
在 Shell 中,调⽤函数时可以向其传递参数。在函数体内部, 通过 $n 的形
式来获取参数的值,例如, $1 表示第⼀个参数,
2
表
示
第
⼆
个
参
数
.
.
.
注
意
,
当
n
>
=
10
时
,
需
要
使
⽤
2 表示第⼆个参数... 注意, 当 n>=10 时,需要使⽤
2表示第⼆个参数...注意,当n>=10时,需要使⽤{n}来获取参数。
funWithParam(){
echo "第⼀个参数为 $1 !"
echo "第⼆个参数为 $2 !"
echo "第⼗个参数为 $10 !"
echo "第⼗个参数为 ${10} !"
echo "第⼗⼀个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为⼀个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
定义我们⾃⼰的函数并在Shell脚本当中调⽤函数
#!/bin/bash
hello(){
echo "hello world"
echo "第⼀个参数为 $1"
echo "第⼆个参数为 $2"
}
hello abc 123
结语
shell开发在许多开发者技能树中,都非必点项;但是,往往在开发中,一些简单的逻辑,使用shell开发可以到达事半功倍的效果。