变量的使用:
定义变量 variable=value “=”两端不能有空格
使用变量 推荐加{}
e.g. skill=’Java’
echo “I am a ${skill} engineer.”
只读变量: readonly url 不能修改
删除变量:unset 变量名 unset不能删除只读变量
单双引号的区别:
‘’:原样输出,不解析其中的变量/命令,用于纯字符串
“”:双引号会解析命令和变量
如果变量的值是数字或者无空格的字符串,可以不加引号
将命令的结果赋值给变量 variable=‘command’或者$(command)
变量作用域
(1)局部变量:只在函数内起作用,但是在函数内的变量默认是全局的,除非用local声明
(2)全局变量:作用域为当前shell进程中
在shell中定义的变量都是该类型
(3)环境变量:在子进程中也可以使用的变量
用export声明,环境变量被创建时的shell进程称为父进程
只传子不传父,必须是父子关系才可以传递环境变量,没有父子关系的不能传递环境变量
使用exit一层层退出shell
(4)把变量写入shell的配置文件,则该变量在所有shell文件中都有效,无论是否有父子关系
特殊变量:
特殊变量 | |
$0 | 当前脚本的名称 |
$n | 传递给脚本或者函数的位置参数 |
$# | 传递给脚本或者函数的参数个数 |
$* | 传递给脚本或者函数的所有参数 |
$@ | 传递给脚本或者函数的所有参数 |
$? | 上个命令的退出状态,或者函数的返回值 |
$$ | 当前shell的进程ID |
$n:当n大于10时,要用{} e.g. $5,${10}
$*和$@不加双引号时完全相同,加了双引号就有不同
“$*”:将所有参数从整体上看作一份数据,不把每个参数看作一份数据
“$@”:将每个参数看作一份数据,彼此独立
字符串:
(1)获取字符串长度:${#字符串名}
(2)字符串拼接
str=$str1$str2 或
str=”$str1:;$str2” 或
str=$str”:;”$str2
(3)字符串截取
从指定位置开始截取(截取方向都是从左往右):
1从左往右,从0开始计数,到start位置开始,截取长度为length的字符串 ${string:start:length}
2从右往左,从1开始计数,到start位置开始,截取长度为length的字符串 ${string:0-start:length}
从指定字符开始截取:
使用#截取右边字符,从左往右匹配${string#*chars}
使用%截取左边字符,从右往左匹配${string%chars*}
${string:start:length} | 从字符串string左边的第 start个,向右截取length个字符 |
${string:start} | 从字符串string左边的第 start个,向右直到最后 |
${string:0-start:length} | 从字符串string右边的第 start个,向右截取length个字符 |
${string:0-start} | 从字符串string右边的第 start个,向右直到最后 |
${string#*chars} | 从字符串string左边开始,第一次出现chars的位置开始,截取chars右边所有的字符(不包括chars) |
${string##*chars} | 从字符串string左边开始,最后一次出现chars的位置开始,截取chars右边所有的字符(不包括chars) |
${string%chars*} | 从字符串string右边开始,第一次出现chars的位置开始,截取chars左边所有的字符(不包括chars) |
${string%%chars*} | 从字符串string右边开始,最后一次出现chars的位置开始,截取chars左边所有的字符(不包括chars) |
数组:
用()来定义,下标[]获取元素,从0开始编号,元素之间用空格分开
Array_name=(ele1 ele2 ele3 …) 等号两边不能有空格
不要求数组中的元素类型全部相同
数组长度不固定,还可以增加
无需逐个元素给数组赋值
e.g. ages=([3]=24 [5]=19 [10]=12) 只给第3、5、10个元素赋值,数组长度为3
(1)获取数组元素:${array_name[index]}
获取所有元素:${array_name[*]}或者${array_name[@]}
用*/@,将数组扩展成列表,再计数
获取数组的长度,即数组元素的个数:
${#array_name[@]}或者${#array_name[*]}
如果数组的某个元素是字符串,还可获得字符串的长度:
e.g. 下标为2的元素是字符串,${#array_name[2]}
(2)数组拼接:
array_new=(${array1[@] ${array2[@]})
或者 array_new=(${array1[*] ${array2[*]})
(3)删除元素:
删除指定下标的元素:unset array_name[index]
删除整个数组:unset array_name
命令:
(1)别名
定义别名:alias new_name=’command’
删除别名:unalias 别名
unalias -a 删除当前shell中的所有别名
(2)echo
echo 输出字符串,默认换行,不解析转义字符
echo -n 字符串 不换行
echo -e 字符串 解析字符串中的转义字符,仍默认换行
read命令
exit命令
declare和typeset 设置变量的属性
数学计算:
(()) | 用于整数计算,效率高 |
let | 用于整数计算,和(())类似 |
$[ ] | 用于整数计算,不如(())灵活 |
expr | 用于整数计算,也可以处理字符串,麻烦 |
bc | Linux下的一个计算器程序,shell本身只支持整数运算,小数运算就要用bc |
declare -i | 将变量定义为整数再运算,但仅支持最基本的加减乘除, |
let 表达式 或者 let “表达式” 或者let ‘表达式’ 都等价于((表达式))
let 表达式1 表达式2 #多个表达式用空格隔开,整个命令的运行结果是最后一个表达式的结果
选择结构:if….else 和 case….in
(1)if….else
if….else有4种形式:
(1) if condition then statement(s) fi | (2) if condition;then statement(s) fi |
(3) if condition then statement1(s) else statement2(s) fi | (4) if condition then satement1(s) elif condition2 then satement2(s) .... else satementn(s) fi |
test命令可以对数值、字符串和文件 进行检测
test expression 或 [ expression ] # [空格expression空格],空格不能省
test命令中使用变量时,要用双引号“"包起来
[[ ]]:shell内置关键字
使用:[[ expression ]] #表达式两边要有空格,[[ ]]命令不用双引号包变量,不用对>、<进行转义
| test或[ ] | [[ ]] |
[ -z”$str1” ] || [ -z”$str2” ] | √ | √ |
[ -z”$str1” -o -z”$str2” ] | √ | × |
[[ -z”$str1” || -z”$str2” ]] | × | √ |
[[ ]]使用=~支持正则表达式
[[ str=~regex ]] e.g.[[ $telnumber=~^1[0~9]{10}$ ]]
使用 if 判断条件时,用(( ))来处理整型数字,用 [[ ]] 来处理字符串或者文件
(2)case....in
使用: case expression in
pattern1)
statements1
;; # 双分号,类似break
pattern2)
statements2
;;
...
*)
statementsn
esac
shell循环结构:while、until、for、select in、break、continue
while | until | while和until的区别: |
while condition do statements done | until condition do statements done | while:当条件为真,进入循环 until:当条件为真,退出循环 |
for循环有两种结构:
for((exp1;exp2;exp3)) #注意括号 (( )) do statements done | for value in value_list do statements done |
用法同C/C++ | 用法同Python |
select ... in 常与case...in一起使用
用法:
select variable in value_list
do
statements
done
break 、continue用法同C/C++,但是在shell中,它还可以用参数n,表示跳出循环的层数,如果省略,表示跳出当前整个循环
break n
continue n
shell函数
定义:
function 函数名(){
statements
[ return value ]
}
直接调用函数名,也可以给函数传递位置参数:函数名 param1 param2....
shell中的函数可以先定义再调用,也可以先调用再定义