您的位置:首页 > 运维架构 > Shell

shell脚本的作用,shell脚本变量的定义和三种赋值方式【shell脚本的学习笔记一】

2016-03-14 22:26 861 查看
为什么要用脚本语言?

以Linux系统为例,linux系统里面有很多个命令,脚本可以是一个或者多个命令的集合,通过运行脚本,达到既定的功能或者效果。

shell与批处理的比较:

Linux环境下有个脚本语言叫做shell,一般的,shell脚本文件以.sh结尾,.sh并没有什么实际作用,只是用来标识这是一个shell脚本语言。

windows环境有个脚本语言叫批处理,以.bat结尾,windows环境下的.bat有其特定作用,因为.bat的标识可通过MIME协议调用指定的应用程序来解释

介绍完背景,就直接开始shell脚本的编写之旅。

国际惯例:第一个程序必须是hello world!

#!/bin/bash
echo "hello world!"

#! 是一个特定的标记,用来告诉系统这个脚本需要用什么程序来执行

保存为shell.sh,然后运行



此时发现权限不够,通过ls -ls指令查看shell.sh的详细信息



发现没有执行权限,因此要修改shell.sh的权限,可通过chmod指令修改,至少加入执行权限



建议修改shell脚本权限的时候在shell脚本前加./,即当前目录下查找,否则会在PATH下开始查找,避免不必要的麻烦。

运行脚本:

[root@localhost /]# ./shell.sh 

hello world!

系统给定的特殊变量:

变量名作用
$0当前脚本的名字
$n传递给脚本或者函数的参数,n表示第几个参数
$#传递给脚本或函数的参数个数
$*传递给脚本或函数的所有参数
$@传递给脚本或者函数的所有参数
$$当前shell脚本进程的PID
$?函数返回值,或者上个命令的退出状态
$BASHBASH的二进制文件问的路径
$BASH_ENVBASH的启动文件
$BASH_VERSINFO
BASH版本信息,有六个元素
$BASH_VERSIONBASH版本号
$EDITOR脚本所调用的默认编辑器
$EUID当前有效的用户ID
$FUNCNAME当前函数名
$GROUPS当前用户所属组
$HOME当前用户家目录
$HOSTTYPE主机类型
$LINENO当前行号
$OSTYPE操作系统类型
$PATHPATH路径
$PPID当前shell进程的父进程ID
$PWD当前工作目录
$SECONDS当前脚本运行秒数
$TMOUT不为0时,超过指定的秒将退出shell
$UID当前用户ID


$* 和 $@ 的区别

$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

定义变量:

字符串变量:string="value",string为变量名,value为字符串

数字变量:num=5,其中num为变量名,5为其对应的值

注意:

1、定义变量时不加$,使用时要加$,用以区别字符串,变量名用{}括来是个好习惯,shell会将花括号里面的字符解释为一个整体,后面将数组的时候会体现。

2、不要在等号两边加上空格,否则将会报错!

测试代码:

#! /bin/bash
string="I am shell"
num=5

echo "a=${a},string=${string}"
执行结果:

[root@localhost /]# ./shell.sh 

a=,string=I am shell

变量定义时等号两边加空格测试:

[root@localhost /]# cat shell.sh 

#! /bin/bash

string = "I am shell"

num = 5

echo "a=${a},string=${string}"

[root@localhost /]# ./shell.sh 

./shell.sh: line 3: string: command not found

./shell.sh: line 4: num: command not found

a=,string=

发现问题没有?定义变量时等号两边加空格会识别不出来。

还有!错误代码会提示,而且还会自动跳过!!变量定义还默认为空!

验证下猜想:

#! /bin/bash

this is wrong test!
echo "a = $a"
执行结果:

[root@localhost /]# cat shell.sh 

#! /bin/bash

this is wrong test!

echo "a = $a"

[root@localhost /]# ./shell.sh 

./shell.sh: line 3: this: command not found

a = 

说明猜想正确!错误代码会跳过并继续执行之后的代码(解释性语言特点)!变量默认值为空!

测试变量的特性以及表达式赋值:

#! /bin/bash

a=5
b=$a+5
echo "now b=$b"
b=8
echo "after:b=$b"
执行结果:

[root@localhost /]# cat shell.sh 

#! /bin/bash

a=5

b=$a+5

echo "now b=$b"

b=8

echo "after b=$b"

[root@localhost /]# ./shell.sh 

now b=5+5

after b=8

由结果可发现,shell中变量没有类型!根据表达式自动改变其类型!还发现一个问题,表达式不能计算结果,变成了字符串的拼接!

又有一个新问题,如何执行表达式的结果而不是字符串的拼接呢?

三种赋值方式:

1、赋值关键字let

使用方法:let 变量名 = 表达式

测试代码;

#! /bin/bash
a=5
let b=$a+5
echo "now b=$b"
let b=8*5
echo "after:b=$b"
执行结果:
[root@localhost /]# cat shell.sh 

#! /bin/bash

a=5

let b=$a+5

echo "now b=$b"

let b=8*5

echo "after b=$b"

[root@localhost /]# ./shell.sh 

now b=10

after b=40

2、从终端(stdin)获取变量赋值:

#! /bin/bash
echo "who are you?"
read name
echo "hello, $name"
运行结果:
[root@localhost /]# cat shell.sh 

#! /bin/bash

echo "who is you?"

read name

echo "hello,$name"

[root@localhost /]# ./shell.sh 

who is you?
oba      【此为输入字符】

bc06

hello,oba

3、使用$(linux命令)来赋值

#! /bin/bash

a=$(ls)
echo "$a"


执行结果:[root@localhost /]# ./shell.sh 

bin

boot

dev

etc

home

lab2.sh

lib

lost+found

media

mnt

opt

proc

qt

root

sbin

selinux

Settings

shell.sh

srv

sys

tmp

usr

var

部分内容参考:http://c.biancheng.net/cpp/shell/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 变量 赋值