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。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
+++
命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
...
下面的脚本:
#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "second Parameter : $2"
echo "Quoted Values: $@"
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