shell 本身是一个用 c 语言编写的程序,又是一种解释型的语言。 是用户使用 Liunx 的桥梁
1> 交互式 interactive : 解释执行用户的命令 , 用户输入一条命令, shell 就解释执行一条
2> 批处理 batch : 用户事先写一个 shell 脚本, 其中很多条命令,让 shell 一次把这些命令执行完
shell 的种类 ,即是 shell 脚本解释器的种类。常见的 shell 脚本解释器有 bash、sh、csh、ksh 等。bash 是 Liunx 默认的 shell , sh 是 Unix 默认的 shell 。 bash 完全兼容 sh, 所以我们学习一般学习 bash , sh 即可。
打开文本编辑器,新建一个文件。扩展名为 sh
输入一些代码:
#!/bin/bash
echo "hello world"
“#!” 是一个约定的标记,告诉系统这个脚本需要什么解释器来执行,echo 命令用与想窗口输出文本,类似于java 的 system.out。
运行脚本: chmod +X ./text.sh #使脚本具有执行权
.text.sh
注意需要将命令行目录切换到文件脚本所在目录, ./text.sh 就会直接在当前目录找。如果有配置环境变量即可写成 text.sh
定义变量时,变量名不加 $ 美元符号,如:
age="18"
需要注意的是,和你熟悉的编程语言不一样变量名和等号之间不能有空格
变量命名须遵循的规则如下:
使用一个定义过的变量,只要在变量名前面加美元符号即可 $ ,如:
#!/bin/bash
echo "what is your name?"
NAME=tommy
echo "my name is ${NAME}"
注意:外面的花括号是可选的。目的是为了区分变量名分界,例如变量名后面还需要输出其他字符串,推荐所有变量都加上花括号
已经定义过的变量可以被重新定义。如:
#!/bin/bash
age=18
echo "age is ${age}"
age=25
echo "age is ${age}"
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。意思就是被执行过 readonly 的变量 是不能被二次赋值的 类似于 java 中的 final
例:
#!/bin/bash
age=18
echo "age is ${age}"
readonly age
age=25
echo "age is ${age}"
很明显的输出第五行,提示只读变量。二次赋值无效
使用 unset 命令可以删除变量,变量被删除后不能再次使用;unset 命令不能删除只读变量
#!/bin/bash
name="bob"
unset name
echo "name is ${name}"
可以看到变量name 没有任何输出
变量的类型分三种
-局部变量
-环境变量
-特殊变量
特殊变量列表
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本的函数的参数,n是一个数字,表示第几个参数 |
$# | 传递给脚本或函数参数的个数 |
$* | 传递给脚本或者函数的所有参数 |
$@ | 传递给脚本或者函数的所有参数,与 $*是否被双引号包含的区别 |
$? | 上个命令的退出状态,或者函数的返回值 |
$$ | 当前 shell进程id,对于shell脚本,就是这些脚本所在的进程id. |
运行脚本时传递给脚本的参数称作命令行参数。命令行参数用 $n 表示, 例如, $1 表示第一个参数 $2 表示第二个参数。依次类推(\为转义符号)
用法
#!/bin/bash
echo "File name is $0"
echo "Parameter 1 : $1"
echo "Parameter 2 : $2"
echo "$@"
echo "$*"
echo "size : $#"
$? 可以获取上个命令行的退出状态。所谓退出状态就是上个命令行执行后的返回结果。执行成功返回0 , 失败返回1。除此之外 $? 还可以表示返回值
转义字符 | 含义 |
---|---|
\\ | 反斜杠 |
\a | 报警,响铃 |
\b | 退格,删除键 |
\f | 换页,将当前位置移到下页开头 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
如果表达式中包含特殊字符, shell 将会进行替换。例如在双引号中使用变量就是一种替换,转义字符也是一种替换
echo - e 表示将特殊字符进行转义输出,否则反之
变量替换可以根据变量的状态(是否为空 是否定义等) 来改变他们的值
可以使用的变量替换形式:
形式 | 说明 |
---|---|
${var} | 变量本来的值 |
${var:-word} | 如果变量 var 为空或者已被删除 unset ,那么返回 word,但不改变 var 的值 |
${var:=word} | 如果变量 var 为空或者已被删除 unset,那么返回 word, 那么并将 var 的值设置为 word |
${var:?msg} | 如果变量 var 为空或者已被删除 unset,那么将消息 msg 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在 shell 中,那么脚本讲停止运行 |
${var:+word} | 如果变量 var 被定义,那么返回 word ,但不改变 var 的值 |
#!/bin/bash
echo ${var:-"Variable is not set"}
echo "1 - Value of var is ${var}"
echo ${var:="Variable is not set"}
echo "2 - Value of var is ${var}"
unset var
echo ${var:+"This is default value"}
echo "3 - Value of var is $var"
var="Prefix"
echo ${var:+"This is default value"}
echo "4 - Value of var is $var"
echo ${var:?"Print this message"}
echo "5 - Value of var is ${var}"
Bash 支持很多运算符,包括算数运算符,关系运算符,布尔运算符,字符串运算符和文件测试运算符。
原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr , expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例:
#!/bin/bash
value = `expr 2 + 2`
echo -e "Total is ${value}"
注意:
#!/bin/sh
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi