第一个Shell脚本

第一个Shell脚本

hello_world脚本

编写一个 Shell 脚本:编写一个脚本使脚本文件可执行把脚本放置到 shell 能够找到的地方

#!/bin/bash
# This is our first script.
# 保存为hello_world
echo 'Hello World!'

#!字符序列是一种特殊的结构叫做shebang。 这个 shebang 被用来告诉操作系统将执行此脚本所用的解释器的名字

对于脚本文件,有两个常见的权限设置;权限为755的脚本,则每个人都能执行,和权限为700的 脚本,只有文件所有者能够执行。设置好权限之后就可运行了:./hello_world

alien@localhost:~ $ echo $PATH
/home/alien/.nvm/versions/node/v8.12.0/bin:/home/alien/bin:/home/alien/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

上面的路径相当于windows中的环境变量。

# 添加环境变量
alien@localhost:~ $ export PATH=~/bin:"$PATH"
alien@localhost:~ $ . .bashrc

这个点(.)命令是 source 命令的同义词,一个 shell 内建命令,用来读取一个指定的 shell 命令文件, 并把它看作是从键盘中输入的一样,.bashrc文件存放了环境变量。

  • ~/bin:存放为个人所用脚本
  • /usr/local/bin:系统中的每个用户都可以使用的脚本
  • /usr/local/sbin:系统管理员使用的脚本

脚本书写规范

ls -ad
ls --all --directory
  • 上述命令等价,短选项更受欢迎。

  • 缩进和行继续符

find playground \( -type f -not -perm 0600 -exec chmod 0600 ‘{}’ ‘;’ \) -or \( -type d -not -perm 0711 -exec chmod 0711 ‘{}’ ‘;’ \)

这样的长命令,可以展开,提高可读性:

find playground \
    \( \
        -type f \
        -not -perm 0600 \
        -exec chmod 0600 ‘{}’ ‘;’ \
    \) \
    -or \
    \( \
        -type d \
        -not -perm 0711 \
        -exec chmod 0711 ‘{}’ ‘;’ \
    \)

变量和常量:

#!/bin/bash
# Program to output a system information page
# 创建了一个title变量
title="System Information Report"
echo "<HTML>
        <HEAD>
                <TITLE>$title</TITLE>
        </HEAD>
        <BODY>
                <H1>$title</H1>
        </BODY>
</HTML>"

变量名规则:

  1. 变量名可由字母数字字符(字母和数字)和下划线字符组成。
  2. 变量名的第一个字符必须是一个字母或一个下划线。
  3. 变量名中不允许出现空格和标点符号。
  4. Shell惯例是指定大写字母来表示常量,小写字母表示真正的变量

Shell可以使用带有-r(只读)选项的内部命令 declare, 来强制常量的不变性。

declare -r TITLE=”Page Title”
variable=value

variable是变量的名字,value是一个字符串,shell 不会 在乎变量值的类型;它把它们都看作是字符串。通过使用带有-i 选项的 declare 命令,你可以强制 shell 把 赋值限制为整数。

赋值过程中,变量名、等号和变量值之间必须没有空格。可以在同一行中对多个变量赋值。

here document 或者 here script也是一种文本输出方法,here document 是另外一种 I/O 重定向形式。

command << token
text
token

我们 在脚本文件中嵌入正文文本,然后把它发送给一个命令的标准输入。command 是一个可以接受标准输入的命令名,token 是一个用来指示嵌入文本结束的字符串。here documents 中的单引号和双引号会失去它们在 shell 中的特殊含义,把它们看作是普通的字符。如果我们把重定向操作符从 “<<” 改为 “<<-”,shell 会忽略在此 here document 中开头的 tab 字符。 这就能缩进一个 here document,从而提高脚本的可读性。

自顶向下设计

先确定上层步骤,然后再逐步细化这些步骤的过程被称为自顶向下设计。开发一个报告产生器脚本:

  • 打开网页
  • 打开网页标头
  • 设置网页标题
  • 关闭网页标头
  • 打开网页主体部分
  • 输出网页标头
  • 输出时间戳
  • 关闭网页主体
  • 关闭网页

步骤7和8之间添加一些额外的任务:

  • 系统正常运行时间和负载。这是自上次关机或重启之后系统的运行时间,以及在几个时间间隔内当前运行在处理 中的平均任务量。
  • 磁盘空间。系统中存储设备的总使用量。
  • 家目录空间。每个用户所使用的存储空间使用量。

shell 函数是位于其它脚本中的“微脚本”,作为自主程序。Shell 函数有两种语法形式:

# name 是函数名,commands 是一系列包含在函数中的命令
# 在脚本中 shell 函数定义必须出现在函数调用之前。
function name {
    commands
    return
}
and
name () {
    commands
    return
}

局部变量允许与已存在的变量名相同,这些变量可以是全局变量, 或者是其它 shell 函数中的局部变量,却不必担心潜在的名字冲突。

#!/bin/bash
# Program to output a system information page
TITLE="System Information Report For $HOSTNAME"
CURRENT_TIME=$(date +"%x %r %Z")
TIME_STAMP="Generated $CURRENT_TIME, by $USER"

report_uptime () {
  cat <<- _EOF_
  <H2>System Uptime</H2>
  <PRE>$(uptime)</PRE>
_EOF_
  return
}

report_disk_space () {
  cat <<- _EOF_
  <H2>Disk Space Utilization</H2>
  <PRE>$(df -h)</PRE>
_EOF_
  return
}
report_home_space () {
  cat <<- _EOF_
  <H2>Home Space Utilization</H2>
  <PRE>$(du -sh /home/*)</PRE>
_EOF_
  return
}
cat << _EOF_
<HTML>
    <HEAD>
        <TITLE>$TITLE</TITLE>
    </HEAD>
    <BODY>
        <H1>$TITLE</H1>
        <P>$TIME_STAMP</P>
        $(report_uptime)
        $(report_disk_space)
        $(report_home_space)
    </BODY>
</HTML>
_EOF_

保存为testtest:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值