新手接触Linux系统的时候,对于Shell脚本比较懵懂,下面写一个简单的教程。
1.脚本名称
正常情况,你需要用.sh
后缀来命名,这样使用者就知道这个是一个shell脚本。当然你不用这个后缀名也是可以的。只要你的内容符合shell脚本的定义,用正确的方式就能执行脚本。
2.脚本第一行
第一行定义是什么类型的文件,此处 /bin/bash 执行我们的文件。比如下面的示例:
|
|
此行称为 shebang(就是 sharp (#) + bang (!) 的意思),会指引操作系统使用接下来指定的程序运行此文件。
可能你会看到有些人第一行是这样的,可以吗?
#!/bin/sh
答案是可以的!只是使用的shell不一样,但是都是支持的,常用的还是用bash shell环境。
可能你还会有疑问说,第一行不写这个,可以吗?
答案也是可以的!只要你调用的方式正确,就可以。
但是正规的shell脚本请写上第一行。
3.执行权限
当你编写了一个脚本,想运行看看是否实现了功能,下面给大家一个实例。
我们先来看看这两个文件:
$ cat test.sh
echo "hello world"
$ cat test2.sh
echo "hello world"
没有给执行权限,那么你执行的时候会出现这样的报错:
$ ./test.sh
-bash: ./test.sh: 权限不够
这时候你可以赋予执行权限,然后再运行:
$ chmod +x test.sh
$ ./test.sh
hello world
当然你不给执行权限,是不是不能执行,也不是,你可以这样操作:
$ sh ./test2.sh
hello world
4.Shell变量
Shell 变量默认全都是字符串。
首先,我们来看看怎么定义变量
varname=值 [var2=val2 ....]
请注意:这边等号左右不能有空格。
比如:
area="gz"
要取用一个变量的值,只需在变量名前面加一个 $
,然后echo出来。
echo $area
有时候变量名可能会和其它文字(匹配最长的符合变量名或特殊变量名要求的内容)混淆,比如:
num=2
# 输出 this is the — shell 尝试寻找 $numnd 的值
echo "this is the $numnd"
# 输出 this is the 2nd — 正确的值
echo "this is the ${num}nd"
# 花括号可以隔开变量名,但是放错位置就很尴尬了。
# 输出 this is the {2}nd
echo "this is the {$num}nd"
5.变量计算
当我们要累加一个数的时候,怎么做?
num=1
num=$num+1
执行看看结果:
1+1
那么,怎么计数:
- 方法一:利用expr命令来执行
num=`expr "$num" + 1`
- 方法二:
num=$((num+1))
6. Shell里的流程控制
不讲语法了,直接实例来:
6.1 if 条件
#!/bin/bash
folder="./testdir"
#-n 判断一个变量是否有值
if [ ! -n "$folder" ]
then
echo "$var is empty"
exit 0
#如果文件夹不存在,创建文件夹
elif [ ! -d "$folder" ]
then
mkdir -p $folder
else
echo "文件夹存在"
fi
需要留意样例的地方:
if
后面空一格- 条件里面括号的空格,防止语法错误
then
什么时候需要加,要换行。
当然你也可以这样写
#!/bin/bash
folder="./testdir"
#-n 判断一个变量是否有值
if [ ! -n "$folder" ] ; then
echo "$var is empty"
exit 0
#如果文件夹不存在,创建文件夹
elif [ ! -d "$folder" ] ;then
mkdir -p $folder
else
echo "文件夹存在"
fi
这里引申一些常用的测试语句:
语法 | 说明 |
---|---|
-f "filename" |
判断是否是一个文件 |
-d "dirname" |
判断是否是一个文件夹 |
-x "/bin/ls" |
判断/bin/ls是否存在并有可执行权限 |
-n "$var" |
判断 $var 变量是否有值 |
"$a" == "$b" |
判断$a和$b是否相等 |
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords" |
当左边命令判断成立,才会执行右边的内容 |
`[ -r "$mailfolder" ] |
更多的语法请自行搜索网上教程即可。
6.2 循环条件
- while循环,我这里介绍循环1到10的例子。
#!/bin/bash
count=1
endcount=10
while [ $count -le $endcount ]
do
echo "$count"
count=$((count+1))
done
只要测试表达式条件为真,则while循环将一直运行。
当然你也可以关键字"break"用来跳出循环,而关键字"continue"则可以跳过一个循环的余下部分,直接跳到下一次循环中。
- for 循环
for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量:
for var in A B C ; do
echo "var is $var"
done
6.3 Shell里的一些特殊符号
- 星号
*
$ echo *.sh
1.sh 2.sh 3.sh
我们加上引号后,就是输出字符串
$ echo "*.sh"
*.sh
- 转义
\
上面的例子,如果不加引号,想输出字符串,有没有办法,我们看看这样的操作:
$ echo \*.jpg
*.jpg
- 引号
引号(单引号和双引号)可以防止通配符*的扩展,我们下面来看看单引号和双引号的区别。
echo $SHELL # => /bin/bash
echo "$SHELL" # => /bin/bash
echo '$SHELL' # => $SHELL
可以看到单引号更严格,所以写shell脚本的时候要注意单双引号的使用。
7. Shell里的函数
语法:
我是一个函数() {
# 函数里面 $1 $2 对应函数所接受到的第一、第二……个参数。
# 下面写你的逻辑
}
例子:
#!/bin/bash
get_type()
{
profile=$1
if [ "$profile" = "test" ]
then
type="test"
elif [ "$profile" = "prod" ]
then
type="prod"
else
type="dev"
fi
echo $type
}
get_type
8.脚本调试
写好了脚本,怎么调试?
sh -x test.sh
调试完毕,就直接
./test.sh
9 结束
本文只是简单的书写了一下shell脚本的一些知识点,希望对你入门Shell会有所帮助。
本文没有授权给任何组织、企业和个人转载,未经作者允许禁止转载!
欢迎关注我的公众号testerzhang,原创技术文章第一时间推送。