shell基础(二)

变量

定义变量

  • 定义变量时,变量名不加美元符号
  • 量名和等号之间不能有空格
  • 首个字符必须为字母(a-z,A-Z)
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用 bash 里的关键字

使用变量

只要在变量名前面加美元符号($)
变量名可加上花括号,帮助解释器识别变量边界(推荐加上)

重新定义变量

直接为变量赋值即可

# 定义变量
[root@bogon ~]# username="张三"

# 使用变量
[root@bogon ~]# echo $username
张三
[root@bogon ~]# echo ${username}
张三

# 重新赋值
[root@bogon ~]# username="李四"

只读变量

只读变量不可以被修改,采用readonly 修饰

# 定义变量后修饰
[root@bogon ~]# username="李四"
[root@bogon ~]# readonly username
[root@bogon ~]# username="张三"
-bash: username: readonly variable

# 定义变量时修饰
[root@bogon ~]# readonly address="beijing"
[root@bogon ~]# address="shanghai"
-bash: address: readonly variable

删除变量

直接采用unset 即可

[root@bogon ~]# myurl="www.baidu.com"
[root@bogon ~]# unset myurl

变量类型

1) 局部变量

局部变量在脚本或命令中定义,仅在当前 shell 实例中有效。

2) 环境变量

所有的程序,都能访问环境变量。

3) shell 变量

shell 变量中有一部分是环境变量,有一部分是局部变量。

Shell 特殊变量

特殊变量列表:

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

∗和 @ 的区别:

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

[root@bogon ~]# cat ./scripts/args.sh
#!/bin/bash

echo "*打印"
for var in "$*"
do
    echo "$var"
done

echo "@打印"
for var in "$@"
do
    echo "$var"
done
[root@bogon ~]# sh ./scripts/args.sh zhansan lisi wangwu zhaoliu tianqi 
*打印
zhansan lisi wangwu zhaoliu tianqi
@打印
zhansan
lisi
wangwu
zhaoliu
tianqi

退出状态

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。

转义字符

加上-e参数即可

[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash
lang="java"
echo "hello $lang \n"
echo -e "hello $lang \n"
[root@bogon ~]# sh ./scripts/test.sh
hello java \n
hello java 

命令替换

[root@bogon ~]# DATE=`date`
[root@bogon ~]# echo $DATE
2017年 06月 17日 星期六 13:18:44 CST
[root@bogon ~]# USERS=`who | wc -l`
[root@bogon ~]# echo $USERS
3

[root@bogon ~]# cat ./scripts/test.sh
#!/bin/bash

ISSUEINFO=`cat /etc/issue`
echo $ISSUEINFO


[root@bogon ~]# sh ./scripts/test.sh
CentOS release 6.5 (Final) Kernel \r on an \m

变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值

形式 说明
${var} 变量值
${var:-word} 变量 var 为空或已被删除(unset),返回 word,不改变 var 的值。
${var:=word} 变量 var 为空或已被删除(unset),返回 word,并将 var 的值设置为 word。
${var:?message} 变量 var 为空或已被删除(unset),将消息 message 送到标准错误输出。
${var:+word} 变量 var 被定义,返回 word,不改变 var 的值。

运算符

算数运算符

+   加法   
-   减法 
*   乘法   
/   除法   
%   取余   
=   赋值 
==  相等。 
!=  不相等。 

关系运算符

-eq 检测两个数是否相等,相等返回 true。 
-ne 检测两个数是否相等,不相等返回 true。    
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 
-lt 检测左边的数是否小于右边的,如果是,则返回 true。  
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。     
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。

布尔运算符

!   非运算,表达式为 true 则返回 false,否则返回 true。   
-o  或运算,有一个表达式为 true 则返回 true。   
-a  与运算,两个表达式都为 true 才返回 true。

字符串运算符

=   检测两个字符串是否相等,相等返回 true。   
!=  检测两个字符串是否相等,不相等返回 true。  
-z  检测字符串长度是否为0,为0返回 true。   
-n  检测字符串长度是否为0,不为0返回 true。  
str 检测字符串是否为空,不为空返回 true。   

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

-b file 检测文件是否是块设备文件,如果是,则返回 true。 
-c file 检测文件是否是字符设备文件,如果是,则返回 true。  
-d file 检测文件是否是目录,如果是,则返回 true。  
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。   
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。   
-p file 检测文件是否是具名管道,如果是,则返回 true。    
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。   
-r file 检测文件是否可读,如果是,则返回 true。   
-w file 检测文件是否可写,如果是,则返回 true。   
-x file 检测文件是否可执行,如果是,则返回 true。  
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。  
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 

Shell注释

注释:以“#”开头的行,会被解释器忽略。

shell 块注释

你可能感兴趣的:(shell基础(二))