Shell脚本编程笔记
如何运行
chmod +x
使文件具有可执行权限, 直接运行- 直接调用解释器, 将脚本文件作为参数传入 (比如
bash hi.sh
) - 使用
source
(也可用.
代替)执行文件
一般使用第一种,方式3执行的方式与前两种都不同:使用source
执行shell
脚本时, 不会创建子进程, 而是在父进程中直接执行。
变量
Shell
中的变量只有字符串这一种类型Shell
中变量名与变量值没有长度限制Shell
的变量也允许比较操作和整数操作, 只要变量中的字符串为数字
定义变量
variable_name=ghui
需要注意:=
两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell
中的变量可以分为两种类型:
- 局部变量 (定义变量时在前面加
local
修饰符) - 全局变量 (定义变量时不加任何修饰符)
局部变量的可见范围是代码块或函数内,全局变量在全局范围内可见。
使用变量
name=ghui
echo $name
echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时还有一个地方需要注意,即: 被双引号括起来的变量会发生变量替换, 单引号不会
#! /bin/sh
str='abc'
echo "1 print $str"
echo '2 print $str'
输出:
1 print abc
2 print $str
常用的字符串操作
name="shell"
sayHi="hello, "$name" !"
sayHi2="hello, ${name} !"
echo $sayHi $sayHi2
输出
hello, shell! hello, shell!
获得字符串长度
string="abcd"
echo ${#string} #输出:4
截取字符串
str="hello shell"
echo ${str:2} #输出: llo shell
echo ${string:1:3} #输出:ell
if
/else
流程控制
#! /bin/sh
a=1
if [ $1=$a ]
then
echo "you input 1"
elif [ $1=2 ]
then
echo "you input 2"
else
#do nothing
echo " you input $1"
fi
这里有两个地方需要注意, 如果某个条件下的执行体为空, 则不能写这个条件。另外, [ ]
两边一定要加空格。
switch流程控制
case expression in
pattern1)
do something... ;;
pattern2)
do something... ;;
pattern2)
do something... ;;
...
esac
注意:
1. ;;
相当于其它语言中的break
2. 每个pattern
之后记得加)
3. 最后记得加esac
(即反的case
)
for循环
for name [in list]
do
...
done
其中,[]
括起来的in list
, 为可选部分, 如果省略in list则默认为in “$@”,即你执行此命令时传入的参数列表。
while循环
while condition
do
do something...
done
#! /bin/sh
i=0
while ((i<5))
do
((i++))
echo "i=$i"
done
until循环
until condition
do
do something...
done
#!/bin/sh
i=5
until ((i==0)) # 这里是i==0
do
((i--))
echo "i=$i"
done
跳出循环
break
,continue
函数
要定义一个函数, 可以使用下面两种形式:
function funcname() | funcname ()
{ | {
do something | do something
} | }
- 函数必须先定义后使用
- 如果在函数中使用
exit
会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return
向脚本传递参数
先shell
脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可。