简介
Shell 由 C 语言编写的命令或程序设计语言。用户使用 Linux 的桥梁。我们使用的bash命令其实本身就是shell脚本
1. 变量
- 说明:命名规则同C语言,此外不能为Bash命令集的关键字重名(如:ls,rm等)
(1)普通变量
# 普通变量定义(具体区别,请了解特殊字符双引号和单引号)
a=“hello”
#或
a=hello
#或
a=‘hello’
# 获取变量值
$a
# 输出变量值 相当于printf
echo $a
# 设为只读变量(不可改/删除)
readonly 变量名
# 删除变量
unset 变量名
(2)数组
# 数组定义
array_name=(value0 value1 value2)
array_name[0]=value0
array_name[1]=value1
# 获取数组元素
${array_name[index]}
${array_name[@]} # 获取数组所有元素
${#array_name[@]} # 获取元素个数
${#array_name[n]} # 获取单个元素长度
# 输出数组元素 相当于printf
echo ${array_name[index]}
# 赋值
array_name2=${array_name[@]}
# 设为只读变量(不可改/删除)
readonly 变量名
# 删除变量
unset 变量名
2. SHELL特殊字符
(1);
- 说明:命令分隔符
(2)&
- 说明:将命令放到后台执行
mysqld_safe --user=mysql & # 将MySQL放到后台启动
(3)|
- 说明:管道符
cat file | grep hello # file 的内容 经过通道,作为grep命令操作的内容
(4)&&
- 说明:命令分割符,有成功判断功能
ls && echo "success" # ls 执行成功 ,才执行 echo命令
(5) ||
- 说明:命令分割符,有失败判断功能
ls && echo "false" # ls 执行失败 ,才执行 echo命令
(6)#
-
#
:注释符 -
$#
:表示位置参数的个数 -
${#变量名}
:表示变量的长度 -
${#变量名[@]}
: 表示数组的个数
(7)!
- 说明:结果取反
if ! [ 1<2 ]; then echo 'ok'; else echo 'no'; fi
# 回显:ok
(8)>
- 说明:输出重定向,覆盖
ls > file1 # ls 显示的内容 存于file1(覆盖存储)
(9)>>
- 说明:输出重定向,追加
ls >> file1 # ls 显示的内容 存于file1(尾行插入存储)
(10)<
- 说明:输入重定向,覆盖
sort -f < file1 # file 的内容,作为sort的操作目标
(11)<<
- 说明:输入重定向,追加
(12)引用符
1)‘’
- 说明:单引号;将内容看为文本,即便有特殊字符或命令
2)“”
- 说明:双引号;可识别文本中
$
(变量转义符),\
转义符,``(倒引号)`,不可识别命令
3)倒引号
- 说明:倒引号;将本文识别为命令,此外可识别特殊字符
(13):
- 说明:空指令符,是个空命令
(14)$
- 说明:变量转义符,后接变量名或后接操作结果
命令 | 描述 |
---|---|
$变量名 或 ${变量名} | |
$? | 确定上一命令是否执行成功(0:成功,非0:失败) |
$((逻辑/算术运算)) | 将运算结果看为某变量的结果(该变量为匿名变量) |
$[条件测试] | 将测试结果看为某变量的结果 |
(15)()
- 说明:子shell域符,
()
内脚本,透明于外部
(16)(())
与[]
- 说明:算术运算符,逻辑运算符
(17){}
- 说明:变量操作符
[root@localhost log] var=/dir1/dir2/file.txt
# 1、对变量取值
[root@localhost log] echo ${var}
/dir1/dir2/file.txt
# 2、求字符串的长度
[root@localhost log] echo ${#var}
19
# 3、提取位置3到最后的字符
[root@localhost log] echo ${var:3}
r1/dir2/file.txt
# 4、从位置3,开始提取5个字符
[root@localhost log] echo ${var:3:5}
r1/di
# 5、从左边开始,删除最短匹配r,这里的*表示删除
[root@localhost log] echo ${var#*r}
1/dir2/file.txt
# 6、从左边开始,删除最短匹配dir
[root@localhost log] echo ${var#*dir}
1/dir2/file.txt
# 7、从左边开始,删除最短匹配数字,支持正则表达式
[root@localhost log] echo ${var#*[0-9]}
/dir2/file.txt
# 8、从左边开始,删除最长匹配di,这里的*表示删除
[root@localhost log] echo ${var##*di}
r2/file.txt
# 9、从右边开始,删除最短匹配di,注意:这里的*在后面。 #在$的左边,从左边开始,%在$的右边,从右边开始
[root@localhost log] echo ${var%di*}
/dir1/
# 10、从右边开始,删除最长匹配di
[root@localhost log] echo ${var%%di*}
/
# 11、用aa替换第一个匹配的di
[root@localhost log] echo ${var/di/aa}
/aar1/dir2/file.txt
# 12、用bbb替换所有匹配的dir
[root@localhost log] echo ${var//dir/bbb}
/bbb1/bbb2/file.txt
# 13、用bbb替换前缀/dir,注意:/本身需要使用转义字符
[root@localhost log] echo ${var/#\/dir/bbb}
bbb1/dir2/file.txt
# 14、用bbb替换前缀le,注意:/本身需要使用转义字符
[root@localhost log] echo ${var/%\le*.txt/bbb}
/dir1/dir2/fibbb
# 15、用bbb替换后缀2*.txt,支持正则表达式
[root@localhost log] echo ${var/%2*.txt/bbb}
/dir1/dirbbb
(18) 通配符
- 说明:
()
,[]
等在通配符中作用完全不同于shell中
(19)算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
3. Shell传递参数
- 说明:介绍调用shell脚本和shell 函数时,如何传参,读参和一些内置参数
# 传递参数
sh test.sh 参数1 参数2 参数3
# 读参数
$1 $2 $3 # 分别存 参数1,2,3
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与 ∗ 相同,但是使用时加引号,并在引号中返回每个参数。如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$0 | 执行文件名 |
$num | 位置参数 |
4. 流程控制
break与continue
- 说明:作用同其他语言(如:java,c,python…)
(1)条件语句
if condition1
then
command1
command2
...
elif condition2
then
command2
else
commandN
fi
# ----example----
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
(2)For循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
# ----example----
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
(3)While循环
# 条件为ture则循环
while condition
do
command
done
# ----example----
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
(4)until循环
# 条件为false 循环
until condition
do
command
done
# ----example----
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
(5)case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
# ----example----
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
5. Shell 函数
# 定义格式;【】表可选选项
[ function ] funname [()]
{
action;
[return int;]
}
# 调用格式
funname
funname 入参1 入参2 入参3 # $1,$2,$3存分别存入参值
# ----example----
# 定义
demoFun(){
echo "第一个参数为 $1 !"
}
#调用
demoFun
demoFun 5 # 传参调用
6. Shell 文件包含
- 说明:和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
# 注意点号(.)和文件名中间有一空格
. filename
# 或
source filename
7. 常用命令
- 说明:shell命令,介绍shell脚本编写是常用的shell命令和bash命令
(1)echo
和printf
- 说明:输出命令,
echo
不识别转义字符,echo -e ....
开启转义功能,printf
识别转义字符
转义序列
序列 | 说明 |
---|---|
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\c | 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 |
\f | 换页(formfeed) |
\n | 换行 |
\r | 回车(Carriage return) |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 一个字面上的反斜杠字符 |
\ddd | 表示1到3位数八进制值的字符。仅在格式字符串中有效 |
\0ddd | 表示1到3位的八进制值字符 |
(2)test
- 说明:shell命令,逻辑运算命令(进行数值、字符和文件三个方面的测试),变量加
$
数值测试参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
字符串测试参数 | 说明 |
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
文件测试参数 | 说明 |
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
# -----数值测试example------
num1=100
num2=100
if test $num1 -eq $num2
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
# -----字符串测试example------
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
# -----文件测试example------
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
(3)let
- 说明:bash命令,算术运算命令。变量不加
$
let a=5+4
let b=9-3
echo $a $b
no=10
let no+=10
let no-=20
(4)expr
- 说明:算术运算,逻辑运算和字符串操作,变量加
$
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uT2ANDRK-1681200106442)(null)]
(5)read
- 说明:bash命令,读键盘命令。回车表读入结束,
CTRL+D
表读入0
(6)sh
,source
和.
-
source
:bash命令,在父进程中执行sh脚本。(因为是父进程执行,执行结果可能影响系统(如:sh中定义的变量成为系统变量))
-
.
:source
命令的别名 -
sh
:shell命令,在子进程中执行sh脚本(因为是子进程执行,执行结果不影响系统)
-
其他:shell作为脚本语言,可直接执行
(子进程中运行,要求用户有该文件的执行权限才可)
(7)unset
- 说明:删除变量/函数d
# 输出变量/函数
unset func_name
unset var_name
-f # 仅删除函数
-v # 仅删除变量
(8)readonly
- 说明:将变量设为仅读(使变量不可改/删除)
(9)shift
- 说明:位置参数左移命令,每执行一次shift命令,就把命令行上的实参向左移一位,即相当于减少一个位置参数。(不影响
$0
)
shift -num # 默认 num为1,表左移一个位置参数