shell笔记2
1.Linux默认shell是bash,Unix默认shell是sh
bash完全兼容sh
2.定义变量:
定义变量时,变量名不加美元符号($),使用变量时才在变量名前加$
变量名和等号之间不能有空格
变量名可以使用的字符只能是数字、字母和下划线
首个字符必须为字母
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如:${skill}Script
3.readonly 命令可以将变量定义为只读变量
unset 命令可以删除变量
4.
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
5.shell 变量替换
echo -e 表示对转义字符进行替换:
- a=10
- echo -e "Value of a is $a \n"
输出:
Value of a is 10
命令替换:
`command`(注意是反引号,不是单引号,这个键位于 Esc 键下方。)
6.算数运算使用expr
expr 3 + 2 (表达式和运算符之间要有空格)
expr 3 - 2
expr 3 \* 2 (乘号前面要加反斜杠\)
expr 3 / 2
输出为:4
7.条件表达式
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 true。 |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
条件表达式语法:
1 if [ $a -lt 100 -a $b -gt 15 ] 2 then 3 echo "$a -lt 100 -a $b -gt 15 : returns true" 4 else 5 echo "$a -lt 100 -a $b -gt 15 : returns false" 6 fi
条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否为0,不为0返回 true。 | [ -z $a ] 返回 true。 |
str | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是具名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
8.shell字符串
单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
- 双引号里可以有变量
- 双引号里可以出现转义字符
获取字符串长度:
- string="abcd"
- echo ${#string} #输出 4
提取子字符串:
- string="alibaba is a great company"
- echo ${string:1:4} #输出liba
查找字符串:
- string="alibaba is a great company"
- echo `expr index "$string" is`
9.数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。
定义数组的一般形式为:array_name=(value1 ... valuen)
读取数组元素值的一般格式是:${array_name[index]}
获取数组的长度:
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
10.条件判断:case ... esac
case 值 in 模式1) command1 command2 command3 ;; 模式2) command1 command2 command3 ;; *) command1 command2 command3 ;; esac
11.for循环语句
for 变量 in 列表 do command1 command2 ... commandN done
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔
12.while循环
while command do Statement(s) to be executed if command is true done
13.until循环
until command do Statement(s) to be not executed until command is true done
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
14.跳出循环:break和continue
break命令允许跳出所有循环(终止执行后面的所有循环)
continue命令与break命令类似,它不会跳出所有循环,仅仅跳出当前循环。
15.shell函数
①Shell 函数必须先定义后使用。
②调用函数只需要给出函数名,不需要加括号。
③函数返回值在调用该函数后通过 $? 来获得
④像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项
⑤如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。
16.shell输入输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |