Shell脚本编程入门

新手如何学习Shell脚本编程

新手接触Linux系统的时候,对于Shell脚本比较懵懂,下面写一个简单的教程。

1.脚本名称

正常情况,你需要用.sh后缀来命名,这样使用者就知道这个是一个shell脚本。当然你不用这个后缀名也是可以的。只要你的内容符合shell脚本的定义,用正确的方式就能执行脚本。

2.脚本第一行

第一行定义是什么类型的文件,此处 /bin/bash 执行我们的文件。比如下面的示例:

1
#!/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,原创技术文章第一时间推送。

公众号二维码

updatedupdated2021-07-152021-07-15