这篇随笔将要介绍关于Shell编程的基本知识,这些将会在假设你已经熟悉了Linux系统和命令行的基本知识。
构建基本脚本
你应该了解或熟悉使用Shell命令行了,但是只是使用Shell命令行的命令,有些问题处理起来又会显得繁琐,当你要经常重复处理类似复杂的事的时候,
那么将它写成一个脚本就是一个不错的主意。
当然在命令行中,你可以将两个命令在一个提示行中输入他们,用分号隔开。$ ./shell1
/tmp
forever :0 2017-11-08 15:12 (:0)
forever pts/0 2017-11-08 15:12 (:0)
$
这就是一个简单的脚本,但是这样的脚本每次都要将所有要执行的命令都放在命令行中,也许一个很小的脚本你可以接受,但是如果是一个很复杂的脚本,我想那就不会是你想要的了。
创建脚本文件
那么既然你不想将所有的命令都写在命令行上,那么就将这些命令都写在一个文件中,那么只需要你运行这个文件就可以了。
在写一个Shell脚本文件的时候,你一定要做的是在第一行,要指定使用的Shell,如下:#!/bin/bash
这里就告诉你要使用 bash shell 来运行你的脚本程序。
我们就将刚才的简单的脚本写成脚本文件。#!/bin/bash
pwd
who
将文件命名为shell1,现在你就要运行这个脚本文件了,但是它可能不如你所想,我们可以试试看。$shell1
bash: shell1: 未找到命令...
$
bash shell并没有找到你写的这个命令,因为你写的脚本所在的目录,并不在PATH环境变量中。
为了解决这个问题,有两个办法:
一、把你当前的目录添加到PATH中。
二、用绝对路径或相对路径引用Shell脚本文件。
我想在现在的情况下将这个脚本的目录添加到PATH并不是一个好办法,那么就使用第二种方法,当前目录用点操作符来表示。$./shell1
bash: ./shell1: 权限不够
$
哇竟然权限不够,查看一下文件权限就可以知道,文件创建的时候的权限就以已经由你的umask的值决定了$ ls -l shell1
-rw-rw-r--. 1 forever forever 21 11月 8 16:24 shell1
$
那我们就该shell1添加执行的权限。chmod u+x shell1
现在再执行试试看$ ./shell1
/tmp
forever :0 2017-11-08 15:12 (:0)
forever pts/0 2017-11-08 15:12 (:0)
$
显示消息
有的时候你需要在你脚本中给用户一些信息,如何让这些信息显示。
那你就要用到了 echo 命令,echo命令本身就是显示一个字符串。$echo Hello
Hello
$
默认情况下 echo 后面直接加上你要输出的字符串就可以,但是有的时候就不如你所愿。$ echo Let's go home
'
Lets go home
$
因为在你出现引号的时候它认为引号中的都是一部分,所以在出现单出来的引号的时候,就要让你把引号补全,所以如果出现其中一种引号就需要在最外面用另一种引号把字符串全部包起来。$ echo "Let's go home"
Let's go home
$
现在我们将这个命令加到脚本文件中。#!/bin/bash
echo "Welcome to use my shell!"$ ./shell1
Welcome to use my shell!
$
现在想加入时间但我不想输出换行那么就加上-n
参数。#!/bin/bash
echo "Welcome to use my shell!"
echo -n "The time and data are:"
date
$ ./shell1
Welcome to use my shell!
The time and data are:2017年 11月 08日 星期三 17:21:44 CST
$
变量
有的时候只是使用单个命令并不能解决所有问题,而是需要其他数据来解决一些问题,这就可以通过变量来解决了。
在Linux系统中就存在这很多的变量,这些变量是环境变量,在变量前加上$
符号就可以使用了。#!/bin/bash
echo "Your PATH is:"
echo $PATH
$ ./shell2
Your PATH is:
/usr/lib64/qt-3.3/bin:/home/forever/perl5/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/forever/.local/bin:/home/forever/bin
$
当然除了这些环境变量,还可以定自己的变量,这些变量会一直在脚本中生效,直到脚本结束。
用户变量不可以超过20个字符,可以使用的字符是数字、字母、下划线,同时区分大小写。
#!/bin/bashdays=365
echo "if you try to think of the year as $days days ,it becomes unmanageable."
$ ./shell3
if you try to think of the year as 365 days ,it becomes unmanageable.
$
在一个变量给另一个变量赋值的时候一定要使用$否则就会被理解成一个字符串,如果想要在输出的使用一些特殊的符号如( $ )就需要在前面加上上一个反斜杠( )。
#!/bin/bashvalue1=10
value2=20
echo "value1 is $value1"
echo "value2 is $value2"
value1=$value2
echo "value1=$value2 value1=$value1"
value2=value1
echo "value2=value1 value2=$value2"
$ ./shell3
value1 is 10
value2 is 20
value1=$value2 value1=20
value2=value1 value2=value1
$
如果你想将一个命令执行的值复制给变量,那么就可以使用( ` )反引号将命令包起来,
#!/bin/bashwhere=`pwd`
echo "You are in $where"
$ ./shell4
You are in /tmp
$
未完待续......