Linux Shell脚本攻略笔记--第一章小试牛刀 1.1-1.3简介+终端打印+玩转变量和环境变量

来源:互联网 发布:win7桌面网络 编辑:程序博客网 时间:2024/05/21 16:22

1.1 简介
在shell环境中,命令是在shell终端中输入并执行。打开中断后,就会出现一个提示符。其形式通常如下:

username@hostname$或者root@hostname#

$表示普通用户,#表示管理员用户root。root是Linux系统中权限最高的用户。

shell脚本通常是一个以shebang(sharp或bash称呼#,bang来称呼!)起始的文本文件。

#!/bin/bash

shebang是一个文本行,其中#!位于解释器路径之前。/bin/bash是Bash的解释器命令路径。

有两种运行脚本的方式。一种是将脚本做为bash的命令行参数,另一种是授予脚本执行权限,将其变为可执行文件。

$ bash script.sh 或 $ bash /home/paht/script.sh

如果将脚本作为bash的命令行参数来运行,那么就用不着脚本中的shebang了。
要是有需要的话,可以利用shebang来实现脚本的独立运行。对此必须设置脚本的可执行权限,这样他就可以使用#!之后的解释器路径来运行了。就像这样

$ chmod a+x script.sh$ ./script.sh  或者  $ /home/path/script.sh

内核会读取脚本的首行并注意到shebang为#!/bin/bash。它识别出/bin/bash并在内部像这样执行该脚本:

$ /bin/bash script.sh

当启动shell时,它一开始会执行一组命令来定义诸如提示文本、颜色等各类设置。这组命令来自位于用户主目录中的脚本本间~/.bashrc(对于登录shell则是~/.bash_profile)。

登录shell是登录主机后获得的那个shell。如果登录图形界面环境后打开了一个shell,就不是登录shell。

在Bash中,每个命令或是命令序列都是通过使用分号换行符来分隔的。

$ cmd1;cmd2   等同于$ cmd1$ cmd2

注释部分以#为起始,一直延续到行尾。注释行通常用于为代码提供注释信息,或者停止执行某行代码。

1.2 终端打印
echo是用于终端打印的基本命令。
在默认情况下,echo在每次调用后会添加一个换行符

对于简单文本,使用带双引号单引号不带双引号的文本可以得到同样的输出结果:

$ echo "Welcome to Bash"Welcome to Bash$ echo Welcome to Bash Welcome to Bash$ echo 'Welcome to Bash'Welcome to Bash

如果打印的文本中包含,就不能将其放入双引号中,或者可以在其之前加上一个特殊的转义字符\将!转义,像这样:

$ echo  Hello World!$ echo 'Hello World!'$ echo "Hello World\!"

注意:
1. 使用不带引号的echo时,没法在所要显示的文本中使用分号,因为分号在Bash Shell中被用作命令界定符。
2. 变量替换在单引号中无效。以后讨论。

另一个可用于终端打印的命令是printf。printf使用的参数和C语言中的printf函数一样。

printf使用引用文本或由空格分隔参数。我们可以在printf中使用格式化字符串,还可以指定字符串的宽度、左右对齐方式等。默认情况下,printf并不像echo命令一样会自动添加换行符,我们必须在需要的时候手动添加,比如像下面的文本:

#!/bin/bash#文件名:printf.shprintf "%-5s %-10s %-4s\n" No Name Markprintf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456printf "%-5s %-10s %-4.2f\n" 2 James  90.9989printf "%-5s %-10s %-4.2f\n" 3 Jeff   77.564我们可以得到如下格式化的输出:No    Name    Mark1     Sarath  80.352     James   91.003     Jeff    77.56

%s、%c、%d和%f 都是格式替换符,其所对应的参数可以置于带引号的格式字符串之后。

%-5s指明了一个格式为左对齐宽度为5的字符串替换。如果不用-指定对齐方式,字符串就采用右对齐方式。宽度指定了保留给某个变量的字符数,如果内容不足,余下的则以空格符填充。

对于浮点数,%-4.2f,其中.2指定保留2个小数位。

在echo中转义换行符
在默认情况下,echo会将一个换行符追加到输出文本的尾部。可以使用-n选项来忽略结尾的换行符。echo同样接受双引号字符串内的转义序列作为参数。如果需要使用转义序列,则采用echo -e “包含转义序列的字符串”这种形式。例如:

echo -e "1\t2\t3"1  2  3

打印彩色输出
每种颜色都有对应的颜色码。比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
要打印彩色文本,也已输入如下命令:

echo -e "\e[1;31m This is red text \e[0m"

\e[1;31m将颜色设置为红色,\e[0m将暗色重新置回。
要设置彩色背景,经常使用的颜色码为:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47。
要打印彩色文本,可以输入如下命令:

echo -e "\e[1;42m Green Background \e[0m"

1.3 玩转变量和环境变量
脚本语言通常不需要在使用变量之前声明变量。只需要直接赋值就可以了。在Bash中,每一个变量的值都是字符串。无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量被称为环境变量。

当应用程序执行时,它接收一组环境变量。可以使用env命令查看所有与终端相关的环境变量。对于进程来说,其运行时的环境变量可以使用下面的命令来查看:

cat /proc/$PID/environ

其中,将PID设置成相关进程的进程ID(PID总是一个整数)

假如有一个叫做gedit的应用程序正在运行。我们可以使用pgrep命令获得gedit的进程ID:

$ pgrep gedit12501

在环境变量以及对应变量值的列表中,每一个变量以name=value的形式来描述,彼此之间由null字符(\0)分隔。

变量可以通过以下方式进行赋值:

var=value

var是变量名,value是赋给变量的值,如果value不包含任何空白字符(例如空格),那么它就不需要使用引号进行引用,否则必须使用单引号或双引号。

注意,var = value不同于val=value。把var=value写成var = value是一个常见的错误,但前者是赋值表达式,后者是一个逻辑表达式,用来判断等式两边是否相等。

在变量名之前加上$前缀就可以打印出变量的内容:

var="value"echo $value或者echo ${value}

环境变量是未在当前进程中定义,而从父进程中继承而来的变量。

export命令用来设置环境变量。至此以后,从当前shell脚本执行的任何应用程序都会继承这个变量。

export PATH="$PATH:/home/user/bin"也可以使用PATH="$PATH:/home/user/bin"export PATH

这样我们就将/home/user/bin添加到PATH中了。

使用单引号时,变量不会被扩展,将依照原样显示:

var=1$ echo '$var' will print $varvar will print 1

但如果变量var已经定义过,那么

$echo "$var"

会打印出该变量的值;如果没有定义过,则什么都不打印。

获得字符串长度
可以使用下面的方法获得变量值的长度:

length=${#var}例如:$ var=1234567890$ echo ${#var}10

识别当前所使用的shell
可以使用下面的方法获得当前使用的是哪种shell:

$ echo $SHELL也可以用$ echo $0例如:$ echo $SHELL/bin/bash$ echo $0/bin/bash

检查是否是超级用户
UID是一个重要的环境变量,可以用于检查当前脚本是以超级用户还是普通用户的身份运行的。例如:

if [ $UID -ne 0 ] ; then      echo Non root user.Please run as root.else       echo  Root userfi

修改Bash提示字符串(username@hostname:~$)
不同GNU/Linux发布版本中提示及颜色略有不同。我们可以使用PS1环境变量来定制提示文本。

PS1环境变量一般存在于~/.bashrc或者/etc/bashrc等设置文件中,可以像设置PATH变量一样设置PS1环境变量。

一些特殊的字符可以扩展成系统参数。例如:\u可以扩展成用户名,\h可以扩展为主机名,而\w可以扩展成为当前目录。

我们也可以使用\e[1;32m \e[0m的特定转义序列来设置彩色的提示符字符串。

0 0