【从0到1 Shell】(二)Shell程序设计语言

版权声明:本文为博主原创文章,转载请注明出处-- https://blog.csdn.net/qq_38790716/article/details/88213068

s h e l l shell 不仅仅充当用户与 U N I X UNIX 或者 L i n u x Linux 交互界面的角色,还可以作为一种程序设计语言来使用。通过 S h e l l Shell 编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。

s h e l l shell 脚本程序有以下两种执行方式:

  • 用户可以输入一系列的命令,交互式地执行它们
  • 用户也可以把所有的这些命令按照顺序保存在一个文件中,然后将该文件作为一个程序来执行

交互式程序

直接在终端输入一系列命令,由shell来判断何时输入完毕

例1:在当前目录下查找文件名包含" s h sh "这3个字符的文件。如果找到的话,则在当前的屏幕上打印出来。

root@VM-0-2-ubuntu:/home/ubuntu/shell# for filename in `ls .`  #注意这里是反引号
> do
> if echo "$filename" | grep "sh"
> then
> echo "$filename"
> fi
> done
ex1-3.sh
ex1-3.sh
ex1-4.sh
ex1-4.sh
ex1-5.sh
ex1-5.sh
ex1-7.sh
ex1-7.sh
ex1-8.sh
ex1-8.sh
ex1-9.sh
ex1-9.sh
ex3-1.sh
ex3-1.sh
ex3-2.sh
ex3-2.sh
ex3-3.sh
ex3-3.sh
ex3-4.sh
ex3-4.sh

s h e l l shell 期待用户下一步的输入时,正常的 s h e l l shell 提示符“#”将会改变为“>”。用户可以一直输入下去,由 s h e l l shell 来判断何时输入完毕并执行程序

创建脚本

s h e l l shell 脚本:包含多个 s h e l l shell 语句的文件

例2:使用 v i vi / v i m vim 命令创建 s h e l l shell 脚本文件

#! /bin/sh
  
#for循环开始
for filename in `ls .`
do
	#如果文件名包含sh
    if echo "$filename" | grep "sh"
    then
    	#输出文件名
        echo "$filename"
    fi
done

把脚本设置为可执行(授予权限)

将脚本编辑完后,该脚本并不能马上执行。在 L i n u x Linux 中,当用户执行某个程序时,必须拥有该文件的执行权限。

我们可以来测试一下,创建一个 S h e l l Shell 脚本,然后用 l l ll l s l ls -l 来查看该 s h e l l shell 脚本的权限:

root@VM-0-2-ubuntu:/home/ubuntu/shell# ll
total 52
-rw-r--r--  1 root   root    136 Mar  5 23:01 ex1-2.sh
  • 通常情况下,每个文件的访问权限都由9位组成,其中最前面3位表示文件的所有者对于该文件的访问权限,中间3位表示与所有者同组的其他用户对于该文件的访问权限,最后3位表示其他组的用户对于该文件的访问权限

  • 在每一组权限中,都用3个字母来表示3中不同的权限,r表示读取权限,w表示写入权限,x表示执行权限

加权限

使用chmod命令使得用户拥有某个文件的执行权限:

chmod [options]  filename

o p t i o n s options 表示各种权限选项。可使用 r r w w x x 这三个字母分别表示读取、写入和执行的权限,也可以使用数字来表示权限。在数字模式下,4表示读取权限,2表示写入权限,1表示执行权限,7为3个数字的和。另外,还可以指定执行权限授予的对象,其中 u u 表示文件的所有者, g g 表示所有者所属的组, o o 表示其他组的用户。在授予权限时,操作符加号"+“表示授予权限,减号”-"表示收回权限。

例3:给上述的ex1-2.sh授予权限:

root@VM-0-2-ubuntu:/home/ubuntu/shell# chmod u+x ex1-2.sh 
root@VM-0-2-ubuntu:/home/ubuntu/shell# ll
total 52
-rwxr--r--  1 root   root    136 Mar  5 23:01 ex1-2.sh*

当授予用户执行权限后,就可以执行该脚本了:

root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-2.sh 
ex1-2.sh
ex1-2.sh
ex1-3.sh
ex1-3.sh
ex1-4.sh
ex1-4.sh
ex1-5.sh
ex1-5.sh
ex1-7.sh
ex1-7.sh
ex1-8.sh
ex1-8.sh
ex1-9.sh
ex1-9.sh
ex3-1.sh
ex3-1.sh
ex3-2.sh
ex3-2.sh
ex3-3.sh
ex3-3.sh
ex3-4.sh
ex3-4.sh

777是一个特殊的权限,表示所有的用户都可以读、写和执行该文件。许多用户为了操作上的方便,会将此权限授予某些文件,这样的操作可能会带来安全隐患,因此,在授予该权限时,需谨慎

向脚本传递参数

很多情况下, s h e l l shell 脚本都需要接受用户的输入,根据用户的输入的参数来执行不同的操作。

								常用的与参数传递有关的系统变量
变量名 说明
$n 表示传递给脚本的第n个参数,例如$1表示第1个参数,$2表示第二个参数…
$# 命令行参数的个数
$0 当前脚本的名称
$* 以”参数1 参数2 参数3…“的形式返回所有参数的值
$@ 以”参数1“ ”参数2“ ”参数3“…的形式返回参数的值
$_ 保存之前执行命令的最后一个参数

如果用户传递的参数多于9个,则不能使用$10来引用第10个参数。为了能够获取第10个参数的值,用户必须处理或保存第1个参数,即$1,然后使用shift命令删除参数1并将所有剩余的参数下移1位,此时$10就变成了$9,以此类推

例4:传递脚本参数

#! /bin/bash
  

echo "$# parameters"
echo "$@"

结果:

root@VM-0-2-ubuntu:/home/ubuntu/shell# chmod +x ex1-3.sh 
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-3.sh a "b c"
2 parameters
a b c
参数扩展

上述的这种传递参数的方式已无法满足需求,因此需要参数扩展

类似于 L i n u x Linux 下的 l s ls l -l 技术,用户可以在 s h e l l shell 程序中使用同样的技术,称为参数扩展。为了获取到这些参数,用户需要在 s h e l l shell 程序中使用 g e t o p t s getopts 命令

例5:介绍如何使用参数扩展

#! /bin/bash

#输出参数索引  
echo "OPTIND starts at $OPTIND"
#接受参数
while getopts ":pq:" optname
    do
    case "$optname" in
        "p")
            echo "Option $optname is specified"
            ;;
        "q")
            echo "Option $optname has value $OPTARG"
            ;;
        "?")
            echo "Unknown option $OPTARG"
            ;;
        ":")
            echo "No argument value for option $OPTARG"
            ;;
        *)
            # should not occur
            echo "Unknown error while processing options"
            ;;
        esac
        echo "OPTIND is now $OPTIND"
    done

结果:

root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -p
OPTIND starts at 1
Option p is specified
OPTIND is now 2
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -q
OPTIND starts at 1
No argument value for option q
OPTIND is now 2
root@VM-0-2-ubuntu:/home/ubuntu/shell# ./ex1-4.sh -f
OPTIND starts at 1
Unknown option f
OPTIND is now 2

当找到某个选项时, g e t o p t s getopts 命令返回 t r u e true 。第二个参数是变量名 o p t n a m e optname ,该变量将接收找到选项的名称

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/88213068
今日推荐