Shell基础

简介

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);

  • 说明:命令分隔符

image-20220626131357498

(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命令

image-20220626165504682

(6)#

  • #:注释符

  • $#:表示位置参数的个数

  • ${#变量名}:表示变量的长度

  • ${#变量名[@]}: 表示数组的个数

image-20220626170106674

(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)‘’

  • 说明:单引号;将内容看为文本,即便有特殊字符或命令

image-20220626134947572

2)“”

  • 说明:双引号;可识别文本中$(变量转义符),\转义符,``(倒引号)`,不可识别命令

image-20220626135854805

3)倒引号

  • 说明:倒引号;将本文识别为命令,此外可识别特殊字符

image-20220626152806332

(13):

  • 说明:空指令符,是个空命令

(14)$

  • 说明:变量转义符,后接变量名或后接操作结果
命令描述
$变量名${变量名}
$?确定上一命令是否执行成功(0:成功,非0:失败)
$((逻辑/算术运算))将运算结果看为某变量的结果(该变量为匿名变量)
$[条件测试]将测试结果看为某变量的结果

image-20220626171746778

(15)()

  • 说明:子shell域符,()内脚本,透明于外部

image-20220626161242114

(16)(())[]

  • 说明:算术运算符,逻辑运算符

image-20220626171746778

image-20220626195459753

(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中

image-20220629041230345

(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

casein
模式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)echoprintf

  • 说明:输出命令,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作为脚本语言,可直接执行

    (子进程中运行,要求用户有该文件的执行权限才可)

image-20220627005210559

image-20220627011034699

(7)unset

  • 说明:删除变量/函数d
# 输出变量/函数
unset func_name  
unset var_name

-f # 仅删除函数
-v # 仅删除变量

(8)readonly

  • 说明:将变量设为仅读(使变量不可改/删除)

(9)shift

  • 说明:位置参数左移命令,每执行一次shift命令,就把命令行上的实参向左移一位,即相当于减少一个位置参数。(不影响 $0
shift -num # 默认 num为1,表左移一个位置参数

image-20220627022741031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值