Shell 脚本入门

理解Linux Shell

Shell:Shell 是基于命令行的解释器,它连接用户和操作系统,允许通过编写脚本来执行系统的命令。

进程:用户在系统中运行的任何一个任务都以进程的形式存在。进程比任务要稍微复杂一些。

文件:存储于硬盘之上,包含用户拥有的数据。

X-窗口:Linux 运行的一种模式。它可以将显示器分为若干个不同的窗口,允许用户并行做几件事情,并可以通过图形界面的方式从一个任务切换到另一个任务。

字符终端:只能显示字符或者非常简单的图形界面。

会话:登陆系统和登出系统之间的时间。

标准 Linux 发行版常见的 Shell 类型

Bourne shell:这是 Linux 下最常见的 shell 之一。它是由贝尔实验室的 Stephen Bourne 编写的。每一个类 Unix 的系统都至少包含一个与其兼容的 shell。Bourne shell 的名字叫做 sh,通常它被放置在 /bin/sh。

C shell:它是 Bill Joy 为伯克利软件发行创建的。它的语法基于 C 编程语言。它主要被用于交互式终端,很少用于编写脚本语言和系统控制。C shell 有很多交互式的命令。
Shell 编程基础

打开一个终端;
查看当前使用的是哪种 shell:echo $SHELL;
在 Linux 下,美元符号 ($) 后面跟着的是 shell 变量;
echo 命令返回你紧随其后输入的内容;
管道符号 (|) 用来连接不同的命令;
#!/bin/sh ——被称为 shebang 。它出现在每个 shell 脚本的第一行,用来指明这个脚本被 /bin/sh 执行。

关于 Shell 脚本

Shell 脚本是以 .sh 为后缀的文本文件,它可以被赋予可执行的权限。
编写和执行脚本的过程

打开终端;
通过 cd 命令切换到你想保存 shell 脚本的目录;
使用 touch 命令创建一个文件,如 touch hello.sh;
使用 vi hello.sh 或者 nano hello.sh 编辑文件;
赋予 hello.sh 可执行的权限:chmod 744 hello.sh;
运行脚本:sh hello.sh 或者 ./hello.sh

编写第一个脚本

#!/bin/bash
# My first script

echo "Hello World!"

将上面的内容保存到一个文件,赋予其可执行的权限并运行它,输出结果如下所示:

Hello World!

在上面的代码中:

#!/bin/bash (is the shebang.)
# My first script (is comment, anything following '#' is a comment)
echo “Hello World!(is the main part of this script)

编写第二个脚本

这个脚本会打印出你的名字和当前正在运行的进程。

#! /bin/bash
echo "Hello $USER"
echo "Hey i am" $USER "and will be telling you about the current processes"
echo "Running processes List"
ps

脚本运行的结果:

编写第三个脚本

这个脚本演示如何与 shell 脚本进行交互

#! /bin/bash
echo "Hey what's Your First Name?";
read a;
echo "welcome Mr./Mrs. $a, would you like to tell us, Your Last Name";
read b;
echo "Thanks Mr./Mrs. $a $b for telling us your name";
echo "*******************"
echo "Mr./Mrs. $b, it's time to say you good bye"

脚本运行的结果:

apple@ubuntu:~/Desktop$ . name.sh
Hey what’s Your First Name?
chen
welcome Mr./Mrs. chen, would you like to tell us, Your Last Name
binbin
Thanks Mr./Mrs. chen binbin for telling us your name


Mr./Mrs. binbin, it’s time to say you good bye

所有操作默认非root用户,本文中用 lz 用户。

首先明白一点,linux系统中的文件不存在类似windows系统里的扩展名(也即后缀,如.txt, .mkv等等),linux将所有文件等同看待,视为文本文件。

举个例子,现在在linux系统下有一个文件,比如说文件名为word。linux会把它当作一个文本文件;假如把word重命名为word.txt,linux依然会把它当作一个文本文件,而且它的名字就是word.txt,并不会像windows那样:看作文件名是word,扩展名(文件类型)是txt。

明白了这一点之后,linux的脚本文件只不过是在文本文件的基础上,赋予了该文件一个可执行权限而已。常见的linux脚本文件的文件名通常是以.sh结尾的,但我们现在知道,无论带不带.sh,只要文件被赋予了可执行权限就是一个可执行文件(可直接命令行输入文件名回车运行,无需sh命令后跟文件名回车),而通常脚本文件后缀为.sh只是给人看的,是告诉你“我很有可能是一个脚本文件”,而对计算机来说都一样,计算机只认权限。

通常shell脚本的第一行以类似#! /bin/bash开头,是告诉系统,这个脚本以bash作为shell来运行(除了bash还有诸如dash、zsh等shell)。

假设我们在~/test/下新建一个脚本文件叫mkdir.sh:

cd ~/test
vim mkdir.sh

#! /bin/bash
mkdir newDir

现在我们ll一下查看文件属性:

$ ll
-rw-rw-r-- 1 lz lz 26 Jun 4 18:46 mkdir.sh

可以看到所有的x位都是-,也就是说该文件还没有被赋予任何可执行权限,我们现在赋予其可执行权限:

chmod a+x mkdir.sh

再运行ll:

$ ll
-rwxrwxr-x 1 lz lz 26 Jun 4 18:46 mkdir.sh*

可以看到所有的x位都是x,切文件名后面有一个*提示我们这是可执行文件。

有4种方式运行shell脚本文件:
在脚本文件目录下直接执行

该方法 需要 该文件有可执行权限,而且需要在文件前加./告诉shell这是在执行可执行文件,否则shell会在PATH中寻找名字是mkdir.sh的命令,显然找不到:

cd test
./mkdir.sh

该方法会在脚本文件目录下生成一个newDir文件夹。
在任意目录下通过绝对路径直接执行

该方法 需要 该文件有可执行权限:

cd
/home/lz/test/mkdir.sh

该方法会在运行该命令时所在目录下生成一个newDir文件夹。
在脚本文件目录下使用sh命令执行

该方法 不需要 该文件有可执行权限:

cd test
sh mkdir.sh

该方法会在脚本文件目录下生成一个newDir文件夹。
在任意目录下通过绝对路径使用sh命令执行

该方法 不需要 该文件有可执行权限:

cd
sh /home/lz/test/mkdir.sh

该方法会在运行该命令时所在目录下生成一个newDir文件夹。

简单的说shell就是一个包含若干行Shell或者Linux命令的文件。对于一次编写,多次使用的大量命令,就可以使用单独的文件保存下来,

以便日后使用。通常shell脚本以.sh为后缀。在编写shell时,第一行一定要指明系统需要哪种shell解释用户的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh则指明使用bash执行。

#!bin/bash

通常,shell脚本会以#!/bin/sh作为默认的shell程序。

执行shell的方式有两种:

第一种是为shell脚本加上可执行权限并执行,

  //为shell脚本直接加上可执行权限并执行

     chmod 755 run.sh

      ./run.sh

第二种是通过sh命令执行shell脚本,例如执行当前目录下的run.sh脚本,命令如下:

  //通过sh命令执行shell脚本

 sh run.sh

注意:那为何『 sh shell.sh 』也可以运行呢?

这是因为 /bin/sh 其实就是 /bin/bash(连结档),使用 sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来运行 shell.sh 这个文件内的相关命令的意思,所以此时你的 shell.sh 只要有 r 的权限即可被运行喔!而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确呢

2。输入输出重定向

Linux使用标准输入stdin和标准输出stdout,来表示每个命令的输入和输出,还使用一个标准错误输出stderr用于输出错误信息。

这三个标准输入输出系统默认与控制终端设备相联系在一起的。因此,在标准情况下,每个命令通常从它的控制终端中获取输入,将输出打印到控制终端的屏幕上。

但是可以重新定义程序的输入stdin和输出stdout,将它们重定向。最基本的方法就是将它们重定义到一个文件上去,从一个文件获取输入/输出到另外的文件中等。

2.1输入重定向

输入重定向使用小于号“<”可以实现。显示文件的cat命令就是将标准输入重定向到文件实现的。

//将/etc/fstab作为输入,重定向到cat命令

cat /etc/fstab

LABEL=/                 /                       ext3    defaults        1 1  
LABEL=/boot             /boot                   ext3    defaults        1 2  
none                    /dev/pts                devpts  gid=5,mode=620  0 0  
none                    /proc                   proc    defaults        0 0  
none                    /dev/shm                tmpfs   defaults        0 0  
/dev/hda3               swap                    swap    defaults        0 0  
/dev/cdrom              /mnt/cdrom              udf,iso9660 noauto,owner,kudzu,ro 0 0  
/dev/fd0                /mnt/floppy             auto    noauto,owner,kudzu 0 0  

2.2输出重定向

输出重定向有两种方式,一种是直接输出,使用一个大于号“>”实现;

另一种是以附加的方式输出,使用两个大于号“>>”实现。

前者会覆盖原始的输出内容,而后者会添加到文件最后。以下通过实例说明其区别。

//ls命令重定向到/root/dir.txt并显示

ls >dir.txt

cat < dir.txt

anaconda-ks.cfg

install.log

install.log.syslog

//ls -l命令以附加的方式重定向到/root/dir.txt并显示

ls -l >>dir.txt

cat < dir.txt

anaconda-ks.cfg

install.log

install.log.syslog

总用量 24

-rw-r–r-- 1 root root 1245 7月22 21:07 anaconda-ks.cfg

-rw-r–r-- 1 root root 14522 7月22 21:01 intall.log

-rw-r–r-- 1 root root 2906 7月22 21:00 install.log.syslog

3。管道

管道和输入输出重定向十分类似。管道的作用是在一个命令的标准输出和另一个命令的标准输入之间建立一个通道。例如下面命令就是将ps -aux的标准输出传递给grep作为输入。

ps -aux | grep httpd

4.shell里的特殊字符

和其他编程语言一样,shell里也有特殊字符。常见的有美元符号($),反斜线(\)和引号。

1。美元符号

美元符号表示变量替换,即用其后面指定的变量的值来代替变量。反斜线“\”为转义字符,转义字符告诉shell不要对其后面的那个字符进行特殊处理,只是当做普通字符。而shell下的引号情况比较复杂,分为三种:双引号("),单引号(’)和倒引号(`)。他们的作用都不尽相同,以下一一说明。

2。双引号(")

由双引号括起来的字符,除$,倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。

3。单引号(’)

由单引号括起来的字符都作为普通字符出现。

4。倒引号(`)

由倒引号括起来的字符串被shell解释为命令行,在执行时,shell会先执行该命令,并以它的标准输出结果取代整个引号部分。

示例1的代码及输出如下:

#echo “My current directory is pwd and logname is $LOGNAME”【双引号中的倒引号和美元符号保持原来的功能】

My current directory is /root and logname is root

示例2的代码及输出如下:

#echo “My current directory is pwd and logname is $LOGNAME”【双引号中的转义字符保持原来的功能】

My current directory is /root and logname is $LOGNAME

示例3的代码及输出如下:

#echo ‘My current directory is pwd and logname is $LOGNAME’【单引号里面的内容不变】

My current directory is pwdand logname is $LOGNAME

5。shell脚本的注释

shell脚本和其它编程语言一样,也拥有注释。注释方法为在注释行前加#号。

例如以下脚本:

[plain] view plain copy

#!/bin/sh  
#Filename: comment.sh  
#Description:this script explains how to make a comment  
   
echo “This script explains how to make a comment ”  

创建脚本时,脚本的第一行通常称为shbang(#!)行。当脚本启动后,UNIX内核检查文件的第一行以决定将要执行的程序类型。

shbang符号(#!)后面的路径是用来解释此脚本的shell位置。要正确使用这个特性,#!必须是文件中最前面的两个字符。如果

文件头部有空格字符或者空白行,则此特性被忽略,该行被解释为普通的注释行。

6。shell脚本的注释后-f的作用

之前是见过这样的写法:

[plain] view plain copy

#!/bin/csh -f  
#Filename: comment.sh  
#Description:this script explains how to make a comment  
echo “This script explains how to make a comment ”  

通常称作快速启动选项,-f开关通知shell启动时不加载.cshrc文件。

对ksh其shbang行可能为!/bin/ksh -p

对于bash可能!/bin/bash --noprofile

https://www.cocobolo.top/linux/2019/06/05/shell%E8%84%9A%E6%9C%AC.html
https://cnbin.github.io/blog/2015/06/22/linux-shell-jiao-ben-ru-men/
https://www.cnblogs.com/jxhd1/p/6274882.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值