ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux Shell 构建基本脚本

2020-06-10 15:59:19  阅读:187  来源: 互联网

标签:脚本 shell 变量 echo 命令 Shell 构建 Linux 2014


1.1 创建 shell 脚本文件

  在创建shell脚本文件时,必须在文件的第一行指定要使用的shell。其格式为:

1 #!/bin/bash

  在通常的shell脚本中,井号(#)用作注释行。shell并不会处理shell脚本中的注释行。然而,shell脚本文件的第一行是个例外,#后面的惊叹号会告诉shell用哪个shell来运行脚本(是的,你可以使用bash shell,同时还可以使用另一个shell来运行你的脚本)。

  在指定了shell之后,就可以在文件的每一行中输入命令,然后加一个回车符。之前提到过,注释可用#添加。例如:

1 #!/bin/bash
2 # This script displays the date and who's logged on
3 date
4 who

  这就是脚本的所有内容了。可以根据需要,使用分号将两个命令放在一行上,但在shell脚本中,你可以在独立的行中书写命令。shell会按根据命令在文件中出现的顺序进行处理。
  还有,要注意另有一行也以#开头,并添加了一个注释。shell不会解释以#开头的行(除了以#!开头的第一行)。留下注释来说明脚本做了什么,这种方法非常好。当两年后回过来再看这个脚本时,你还可以很容易回忆起做过什么。
  将这个脚本保存在名为test1的文件中,基本就好了。在运行新脚本前,还要做其他一些事。
  现在运行脚本。

1 $ test1
2 bash: ./test1: Permission denied3 $

  现在shell找到了脚本文件,但还有一个问题。shell指明了你还没有执行文件的权限。快速查看一下文件权限就能找到问题所在。

1 $ ls -l test1
2 -rw-rw-r-- 1 user user 73 Sep 24 19:56 test1
3 $

  在创建test1文件时,umask的值决定了新文件的默认权限设置。由于umask变量在Ubuntu中被设成了022,所以系统创建的文件只有文件属主和属组才有读/写权限。
    下一步是通过chmod命令赋予文件属主执行文件的权限。

1 $ chmod u+x test1
2 $ ./test1
3 Mon Feb 21 15:38:19 EST 2014
4 Christine tty2 2014-02-21 15:26
5 Samantha tty3 2014-02-21 15:26
6 Timothy tty1 2014-02-21 15:26
7 user tty7 2014-02-19 14:03 (:0)
8 user pts/0 2014-02-21 15:21 (:0.0) $

  成功了!现在万事俱备,只待执行新的shell脚本文件了。

1.2 显示消息

  大多数shell命令都会产生自己的输出,这些输出会显示在脚本所运行的控制台显示器上。很多时候,你可能想要添加自己的文本消息来告诉脚本用户脚本正在做什么。可以通过echo命令来实现这一点。如果在echo命令后面加上了一个字符串,该命令就能显示出这个文本字符串。

1 $ echo This is a test
2 This is a test
3 $

  注意,默认情况下,不需要使用引号将要显示的文本字符串划定出来。但有时在字符串中出现引号的话就比较麻烦了。

1 $ echo Let's see if this'll work
2 Lets see if thisll work
3 $

  echo命令可用单引号或双引号来划定文本字符串。如果在字符串中用到了它们,你需要在文本中使用其中一种引号,而用另外一种来将字符串划定起来。

1 $ echo "This is a test to see if you're paying attention"
2 This is a test to see if you're paying attention
3 $ echo 'Rich says "scripting is easy".'
4 Rich says "scripting is easy".
5 $

  所有的引号都可以正常输出了。可以将echo语句添加到shell脚本中任何需要显示额外信息的地方。

1 $ cat test1
2 #!/bin/bash
3 # This script displays the date and who's logged on
4 echo The time and date are:
5 date
6 echo "Let's see who's logged into the system:"
7 who
8 $

  当运行这个脚本时,它会产生如下输出。

 1 $ ./test1
 2 The time and date are:
 3 Mon Feb 21 15:41:13 EST 2014
 4 Let's see who's logged into the system:
 5 Christine tty2 2014-02-21 15:26
 6 Samantha tty3 2014-02-21 15:26
 7 Timothy tty1 2014-02-21 15:26
 8 user tty7 2014-02-19 14:03 (:0)
 9 user pts/0 2014-02-21 15:21 (:0.0)
10 $

  很好,但如果想把文本字符串和命令输出显示在同一行中,该怎么办呢?可以用echo语句的-n参数。只要将第一个echo语句改成这样就行:

1 echo -n "The time and date are: "

  你需要在字符串的两侧使用引号,保证要显示的字符串尾部有一个空格。命令输出将会在紧接着字符串结束的地方出现。现在的输出会是这样:

1 $ ./test1
2 The time and date are: Mon Feb 21 15:42:23 EST 2014
3 Let's see who's logged into the system:
4 Christine tty2 2014-02-21 15:26
5 Samantha tty3 2014-02-21 15:26
6 Timothy tty1 2014-02-21 15:26
7 user tty7 2014-02-19 14:03 (:0)
8 user pts/0 2014-02-21 15:21 (:0.0)
9 $

  完美!echo命令是shell脚本中与用户交互的重要工具。你会发现在很多地方都能用到它,尤其是需要显示脚本中变量的值的时候。我们下面继续了解这个。

1.3 使用变量

1.3.1 环境变量

  运行shell脚本中的单个命令自然有用,但这有其自身的限制。通常你会需要在shell命令使用其他数据来处理信息。这可以通过变量来实现。变量允许你临时性地将信息存储在shell脚本中,以便和脚本中的其他命令一起使用。本节将介绍如何在shell脚本中使用变量。
  shell维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统ID(也称为UID)、用户的默认主目录以及shell查找程序的搜索路径。可以用set命令来显示一份完整的当前环境变量列表。

 1 $ set
 2 BASH=/bin/bash
 3 [...]
 4 HOME=/home/Samantha
 5 HOSTNAME=localhost.localdomain
 6 HOSTTYPE=i386
 7 IFS=$' \t\n'
 8 IMSETTINGS_INTEGRATE_DESKTOP=yes
 9 IMSETTINGS_MODULE=none
10 LANG=en_US.utf8
11 LESSOPEN='|/usr/bin/lesspipe.sh %s'
12 LINES=24
13 LOGNAME=Samantha
14 [...]

  在脚本中,你可以在环境变量名称之前加上美元符($)来使用这些环境变量。下面的脚本演示了这种用法。

1 $ cat test2
2 #!/bin/bash
3 # display user information from the system.
4 echo "User info for userid: $USER"
5 echo UID: $UID
6 echo HOME: $HOME
7 $

  $USER、$UID和$HOME环境变量用来显示已登录用户的有关信息。脚本输出如下:

1 $chmod u+x test2
2 $ ./test2
3 User info for userid: Samantha
4 UID: 1001
5 HOME: /home/Samantha
6 $

  注意,echo命令中的环境变量会在脚本运行时替换成当前值。另外,在第一个字符串中可以将$USER系统变量放置到双引号中,而shell依然能够知道我们的意图。但采用这种方法也有一个问题。看看下面这个例子会怎么样。

1 $ echo "The cost of the item is $15"
2 The cost of the item is 5

  显然这不是我们想要的。只要脚本在引号中出现美元符,它就会以为你在引用一个变量。在这个例子中,脚本会尝试显示变量$1(但并未定义),再显示数字5。要显示美元符,你必须在它前面放置一个反斜线。

1 $ echo "The cost of the item is \$15"
2 The cost of the item is $15

  看起来好多了。反斜线允许shell脚本将美元符解读为实际的美元符,而不是变量。下一节将会介绍如何在脚本中创建自己的变量。

说明:你可能还见过通过${variable}形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。

1.3.2 用户变量

  除了环境变量,shell脚本还允许在脚本中定义和使用自己的变量。定义变量允许临时存储数据并在整个脚本中使用,从而使shell脚本看起来更像一个真正的计算机程序。
  用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过20个。用户变量区分大小写,所以变量Var1和变量var1是不同的。这个小规矩经常让脚本编程初学者感到头疼。
  使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(另一个困扰初学者的用法)。这里有一些给用户变量赋值的例子。

1 var1=10
2 var2=-57
3 var3=testing
4 var4="still more testing"

  shell脚本会自动决定变量值的数据类型。在脚本的整个生命周期里,shell脚本中定义的变量会一直保持着它们的值,但在shell脚本结束时会被删除掉。
  与系统变量类似,用户变量可通过美元符引用。

 1 $ cat test3
 2 #!/bin/bash
 3 # testing variables
 4 days=10
 5 guest="Katie"
 6 echo "$guest checked in $days days ago"
 7 days=5
 8 guest="Jessica"
 9 echo "$guest checked in $days days ago"
10 $

  运行脚本会有如下输出。

1 $ chmod u+x test3
2 $ ./test3
3 Katie checked in 10 days ago
4 Jessica checked in 5 days ago
5 $

  变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。

1 $ cat test4
2 #!/bin/bash
3 # assigning a variable value to another variable
4 value1=10
5 value2=$value1
6 echo The resulting value is $value2
7 $

  在赋值语句中使用value1变量的值时,仍然必须用美元符。这段代码产生如下输出。

1 $ chmod u+x test4
2 $ ./test4
3 The resulting value is 10
4 $

  要是忘了用美元符,使得value2的赋值行变成了这样:

  value2=value1

  那你会得到如下输出:

1 $ ./test4
2 The resulting value is value1
3 $

  没有美元符,shell会将变量名解释成普通的文本字符串,通常这并不是你想要的结果。

1.3.3 命令替换

  shell脚本中最有用的特性之一就是可以从命令输出中提取信息,并将其赋给变量。把输出赋给变量之后,就可以随意在脚本中使用了。这个特性在处理脚本数据时尤为方便。
  有两种方法可以将命令输出赋给变量:

  •   反引号字符(`)
  •   $()格式

  要注意反引号字符,这可不是用于字符串的那个普通的单引号字符。由于在shell脚本之外很少用到,你可能甚至都不知道在键盘什么地方能找到这个字符。但你必须慢慢熟悉它,因为这是许多shell脚本中的重要组件。提示:在美式键盘上,它通常和波浪线(~)位于同一键位。
  命令替换允许你将shell命令的输出赋给变量。尽管这看起来并不那么重要,但它却是脚本编程中的一个主要组成部分。
  要么用一对反引号把整个命令行命令围起来:

1 testing='date'

  要么使用$()格式:

1 testing=$(date)

  shell会运行命令替换符号中的命令,并将其输出赋给变量testing。注意,赋值等号和命令替换字符之间没有空格。这里有个使用普通的shell命令输出创建变量的例子。

1 $ cat test5
2 #!/bin/bash
3 testing=$(date)
4 echo "The date and time are: " $testing
5 $

  变量testing获得了date命令的输出,然后使用echo语句显示出它的值。运行这个shell脚本生成如下输出。

1 $ chmod u+x test5
2 $ ./test5
3 The date and time are: Mon Jan 31 20:23:25 EDT 2014
4 $

  这个例子毫无吸引人的地方(也可以干脆将该命令放在echo语句中),但只要将命令的输出放到了变量里,你就可以想干什么就干什么了。
  下面这个例子很常见,它在脚本中通过命令替换获得当前日期并用它来生成唯一文件名。

1 #!/bin/bash
2 # copy the /usr/bin directory listing to a log file
3 today=$(date +%y%m%d)
4 ls /usr/bin -al > log.$today

  today变量是被赋予格式化后的date命令的输出。这是提取日期信息来生成日志文件名常用的一种技术。+%y%m%d格式告诉date命令将日期显示为两位数的年月日的组合。

1 $ date +%y%m%d
2 140131
3 $

  这个脚本将日期值赋给一个变量,之后再将其作为文件名的一部分。文件自身含有目录列表的重定向输出。运行该脚本之后,应该能在目录中看到一个新文件。

1 -rw-r--r-- 1 user user 769 Jan 31 10:15 log.140131

  目录中出现的日志文件采用$today变量的值作为文件名的一部分。日志文件的内容是/usr/bin目录内容的列表输出。如果脚本在明天运行,日志文件名会是log.140201,就这样为新的一天创建一个新文件。

警告 命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,由该子shell所执行命令是无法使用脚本中所创建的变量的。
  在命令行提示符下使用路径./运行命令的话,也会创建出子shell;要是运行命令的时候不加入路径,就不会创建子shell。如果你使用的是内建的shell命令,并不会涉及子shell。在命令行提示符下运行脚本时一定要留心!

标签:脚本,shell,变量,echo,命令,Shell,构建,Linux,2014
来源: https://www.cnblogs.com/Reverse-xiaoyu/p/13045150.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有