');
Allen 2022-03-24 500 0 0 0 0

sh种类和简介

sh 的全称是 Bourne shell,由 AT&T 公司的 Steve。Bourne开发,为了纪念他,就用他的名字命名了。

sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

csh:sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。(Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。BSD 是 UNIX 的一个重要分支,后人在此基础上发展出了很多现代的操作系统,最著名的有 FreeBSD、OpenBSD 和 NetBSD,就连 Mac OS X 在很大程度上也基于BSD。)

tcsh:tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

ash:一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。

bash:bash shell 是 Linux 的默认 shell。(bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 Shell 代码可以不加修改地在 bash 中运行。)

...

查看 Shell

Shell 是一个程序,一般都是放在/bin或者/user/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。

如果你希望查看当前 Linux 的默认 Shell,那么可以输出 SHELL 环境变量:

--查看当前系统的shell

cat /etc/shells

--显示默认的shell

echo $SHELL

+++

第一个Shell脚本

--首行

#!/bin/bash

#“#!” 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。echo命令用于向窗口输出文本。

echo "What is your name?"

read PERSON

echo "Hello, $PERSON"

...

--给文件增加执行权限

chmod +x ./test.sh  #使脚本具有执行权限

...

--作为可执行程序

./test.sh  #执行脚本

注意,一定要写成./test.sh,而不是test.sh。

(就是必须指定目录,否则会找不到命令。(因为linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找。)

(通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。

...

--作为解释器参数

也可以用下面方式支行:直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh test.sh

/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

===

变量

+++

定义变量

Shell 支持以下三种定义变量的方式:

variable=value

variable='value'

variable="value"

...

variable 是变量名,value 是赋给变量的值。

如果 value 不包含任何空白符(例如空格、Tab缩进等),那么可以不使用引号;

如果 value 包含了空白符,那么就必须使用引号包围起来。

(赋值号的周围不能有空格。

--单引号和双引号区别

单引号时,带$符的变量会被当成字符串;双引号时,带$符的变量才会作为变量处理

+++

变量定义举例:

url=http://sss.com

echo $url

name='张三'

echo $name

+++

使用变量

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

author="张三"

echo $author

echo ${author}

(花括号{ }是可选的,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

echo "I am good at ${skill}Script"

如果不加花括号,写成echo "I am good at $skillScript",解释器就会把 $skillScript当成一个变量(其值为空)

(推荐给所有变量加上花括号{ },这是个良好的编程习惯。

+++

修改变量的值

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

url="http://xxx.com"

echo ${url}

url="http://xxx.net"

echo ${url}

(第二次对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

+++

将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`

variable=$(command)

第一种方式把命令用反引号包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式;

第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

...

例如,我创建了一个名为 log.txt 的文本文件,用来记录我的日常工作。

使用 cat 命令将 log.txt 的内容读取出来,并赋值给一个变量,然后使用 echo 命令输出。

log=$(cat log.txt)

echo $log

+++

只读变量

可以用readonly将变量设为只读

readonly myUrl

(设置后不能再被赋值

+++

删除变量

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

unset variable_name

(变量被删除后不能再次使用;unset 命令不能删除只读变量。

+++

变量类型

运行shell时,会同时存在三种变量:

1) 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


===

特殊变量列表

变量 含义

$0 当前脚本的文件名

$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$# 传递给脚本或函数的参数个数。

$* 传递给脚本或函数的所有参数。

[email protected] 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$? 上个命令的退出状态,或函数的返回值。

$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。


+++

命令行参数

运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

...

下面的脚本:

#!/bin/bash

echo "File Name: $0"

echo "First Parameter : $1"

echo "second Parameter : $2"

echo "Quoted Values: [email protected]"

echo "Quoted Values: $*"

echo "Total Number of Parameters : $#"

...

执行结果:

# ./test.sh a b c d

File Name: ./test.sh

First Parameter : a

second Parameter : b

Quoted Values: a b c d

Quoted Values: a b c d

Total Number of Parameters : 4


【版权声明】
本文为转帖,原文链接如下,如有侵权,请联系我们,我们会及时删除!
原文链接:http://c.biancheng.net/cpp/view/2739.html
Tag: Linux Linux基础 Shell
我也要发一个   ·   返回首页     ·   返回[Linux]   ·    前一个  ·   下一个
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Linux]   ·   返回顶部