Shell脚本之变量与传递参数1

何为Shell脚本

第一个shell脚本

#!/bin/bash
echo "hello world"

shell是指一种应用程序,这个应用程序提供了一个界面,用户可以通过这个界面访问操作系统内核服务。Ken Thompson的sh是第一种UnixShell,Windows Explorer 是一个典型界面shell。Shell脚本(shell script),一种专门为shell编写的脚本程序。业界所说的shell通常是指shell脚本,但是我们因该知道shell和shell脚本是两个不同的概念。Shell编程和JavaScrit,PHP编程一样,只要有个能编写代码的文本编辑器和一个解析执行的脚本解释器即可。
Linux的shell种类众多,常见的有:
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)<易用,免费,大多数Linux系统默认>
C Shell (/usr/bin/csh)
K Shell (/usr/bin/ksh)
Shell for Root(/sbin/sh)

#!:告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序。

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

echo 命令用于窗口输出文本。

运行Shell脚本有两种方法:

1.作为可执行程序

将上面的代码保存为 test.sh 并cd到相应目录
chmod +x ./text.sh #使脚本具有执行权限
./text.sh #执行脚本

2.作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本文件名。
/bin/sh text.sh
/bin/php text.php
这种方式运行脚本,不需要在第一行指定 解释器信息。

Shell 变量

your_name=“runoob.com”
注意,变量名和等号之间不能有空格。
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看关键字)

使用一个定义好的变量,只需要在变量名前面加$美元符号即可例如

your_name="name1"
echo $name1
echo ${name1}

变量名外面的花括号是可选的,加不加都可以,加花括号是为了帮助解释器识别变量的边界

已定义的变量可以被重新定义,如:

your_name="aa"
echo ${your_name}
your_name="bb"
echo ${your_name}

只读变量

使用readonly命令可以将变量定义位只读变量,只读变量的值不能被改变。

#!/bin/bash
myUrl="http://www.google.com"
readonly myUrl
myUrl="http://www.runoob.com"
运行脚本的结果如下:
/bin/sh:MAME:This variable is readonly.
your_name:readonly variable

删除变量

使用unset命令可以删除变量。

unset variable_name 

变量被删除之后不能再次使用。unset命令不能删除只读变量。
实例

#!/bin/bash
myUrl="http://www.google.com"
unset myUrl
echo ${myUrl}

上述例子没有任何输出

变量的类型

运行Shell的时候会同时存在三种变量:
1)局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
2)环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序还需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量。
3)shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,一部分是局部变量,这些变量保证shell的正常运行

Shell 字符串

字符串是shell编程中最常用的数据类型(常用的数据类型,数字,字符串)
字符串可以使用双引号,也可以不用引号。单双引号的区别跟PHP类似。

单引号

str='this is a string'

单引号的限制:
单引号里任何字符都会原样输出,单引号字符串的变量是无效的;
单引号字符串中不能出现单独的一个单引号,但是可以成对出现作为字符串拼接使用。

双引号

your_name=‘runoob’
str="hello,I konw you are \"$your_name\"! \n" #这里使用转义字符 \ 让"直接输出
echo -e $str

输出的结果为:

hello,I know you are "runoob"!

双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

拼接字符串

your_name="runoob"
#使用双引号拼接
greeting="hello,"$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting $greeting_1

#使用单引号拼接
greeting_2='hello,'$your_name' !'
greeting_3='hello,${your_name} !'
echo $greeting_2 $greeting_3

输出的结果是:

hello,runoob ! hello,runoob !
hello,runoob ! hello,${your_name} !

获取字符串长度

string="abcd"
echo ${#string} #输出4

提取子字符串

以下实例从字符串第二个字符开始截取4个字符:

string="runoob is a great site"
echo ${string:1:4} #输出unoo

查找子字符串

查找字符i或o的位置(那个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io` #输出4 检测的是o的位置


string="irunoob is a great site"
echo `expr index "$string" io` #输出1 检测的是i的位置

特别注意查找子字符串中的 ` 是反引号,不是单引号’

Shell数组

bash支持一维数组(不支持多维数组),并没有限定数组的大小。
类似于C语言,数组元素的下标由0开始编号,获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.

定义数组

在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制

读取数组

格式
${数组名[下标]}

例如:

valuen=${array_name[n]}

还可以使用@符号获取数组中的所有元素,例如:

   echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

#取得数组元素的个数
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得数组单个元素的长度
lengthn=${#array_name[n]}

shell的注释

#开头的行就是注释,会被解释器忽略。
通过每一行加一个#号设置多行注释

多行注释还可以使用以下格式

:<

EOF 也可以使用其他符号

多行注释还可以使用以下格式

:<<'
注释内容...
注释内容...
注释内容...
'

多行注释还可以使用以下格式
:< 注释内容…
注释内容…
注释内容…
!

==========================================================

Shell 传递参数

我们可以在执行Shell脚本时,向脚本传递参数,脚本内获取的格式为 $n。n代表一个数字
1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推…

实例
以下实例我们向脚本传递三个参数,并分别输出,其中$0为执行的文件名

#!/bin/bash
echo "shell传递参数实例";
echo "执行的文件名: $0";
echo "第一个参数为: $1";
echo "第二个参数为: $2";
echo "第三个参数为: $3";

为脚本设置可执行权限,并执行脚本。其输出结果如下所示

$ chmod +x text.sh
$ ./text.sh 1 2 3
shell 传递参数实例!
执行的文件名: ./text.sh
第一个参数为: 1
第一个参数为: 2
第一个参数为: 3

$# 传递到脚步的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。
"$*"用 " 括起来的情况,以"$1 $2 ... $n"的形式输出所有参数。

$$ 脚本运行的当前进程ID号

$@$*相同但是使用时加引号,并在引号中返回每个参数。
"$@"" 括起来的情况,以"$1" "$2"..."$n"的形式输出所有参数。

$- 显示Shell使用的当前选项,与set命令功能相同。

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

#!bin/bash
echo "Shell 传递参数实例";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x text.sh
$ ./text.sh 1 2 3
Shell 传递参数实例!
第一个参数为1:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3 

$*$@的区别
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数1 ,2,3,,则"*"等价与"1 2 3"(传递一个参数)
,而"@"等价于"1" "2" "3"(传递三个参数)

#!/bin/bash

echo "-- \$*演示---"
for i in "$*"; do
	echo $i
done

echo "-- \$@演示---"
for i in "$@"; do
	echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh
$ ./test.sh 1 2 3
--$*演示---
1 2 3 
--$@演示---
1
2
3

还有后续的等有空再来写

你可能感兴趣的:(Shell)