Linux and Shell笔记梳理

本文详细介绍了Linux系统中的Shell脚本,包括#!的用途、echo命令、chmod权限控制,以及如何定义和使用变量、数组。还讲解了文件属性测试、条件判断、算术运算和字符串比较,同时涵盖日期时间处理和循环结构。通过实例展示了如何在Shell脚本中进行文件测试、参数传递和函数操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

echo 命令用于向窗口输出文本。

chmod 权限控制:

第1个字符有两种情况:如果是“d”则代表这是一个文件夹,如果是“—”代表这是一个文件;

d代表的是目录(directroy)

-代表的是文件(regular file)

s代表的是套字文件(socket)

p代表的管道文件(pipe)或命名管道文件(named pipe)

l代表的是符号链接文件(symbolic link)

b代表的是该文件是面向块的设备文件(block-oriented device file)

c代表的是该文件是面向字符的设备文件(charcter-oriented device file)

第2、3、4个字符:表示文件拥有者的权限,可以用u来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;

第5、6、7个字符:表示文件所属群组的权限,可以用g来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;

第8、9、10个字符:表示的是除拥有者和所属群组之外的其他所有的用户,可以用o来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限。

rwx = 111 = 7;    rw- = 110 = 6;    r-x = 101 = 5;    r-- = 100 = 4;    -wx = 011 = 3;    -w- = 010 = 2;    --x = 001 = 1;    --- = 000 = 0

输出:echo "xxx" 

echo -e 处理特殊字符

若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

\a 发出警告声;

\b 删除前一个字符;

\c 最后不加上换行符号;(常用)

\f 换行但光标仍旧停留在原来的位置;

\n 换行且光标移至行首;(常用)

\r 光标移至行首,但不换行;

\t 插入tab;

\v 与\f相同;

\ 插入\字符;

\nnn 插入nnn(八进制)所代表的ASCII字符;

定义变量:变量名="xxx(内容)"   注意:=前后不能有空格

输出变量内容:echo ${变量名}(推荐) 或者 echo $变量名  如需打印$使用转义字符\,echo命令自带换行

只读变量:readonly 变量名

删除变量:unset 变量名

定义数组: array=("" "" "" "" "")

输出数组:echo -e "\n${array[下标]}"   //下标可以是@或者*,表示全部;可以是数字表示数组单个内容

获取数组长度:echo ${#array[@]}     //主要功能是#字符

获取单个数组内容长度:echo ${#array[n]}    //n是数组内第n单个字符串

多行注释:

:<<自定义字符如 a或者! 

自定义字符如a或者!  //必须单行,若中间出现自定义字符的字符串需要用转义字符\

参数传递:

$#    传递到脚本的参数个数

$*    以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。

$$    脚本运行的当前进程ID号

$!    后台运行的最后一个进程的ID号

$@  与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数

$-    显示Shell使用的当前选项,与set命令功能相同。

$?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

if [ -n ${1} ]; then                    备注:[]中间要用空格

echo "包含第一个参数"

else 

echo "不包含第一个参数"

fi                                            备注:if对应的结尾是fi,没有结尾会报错

 

Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:

算术比较, 比如一个变量是否为0, [ $var -eq 0 ]。

文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]。

字符串比较, 比如两个字符串是否相同, [[ $var1 = $var2 ]]。

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

运算符:val=`expr 2 + 2`    //注意是反引号`,其中+前后都注意保持空格完整性

算数运算符包括:+    -    *    /    %    =    ==    !=   备注:由于*是特殊字符,需要转义字符\。在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。

关系运算符包括:-eq(等于)    -nq(不等于)    -gt(大于)    -lt(小于)    -ge(大于等于)    -le(小于等于)

布尔运算符: !(非)    -o(或)    -a(与)

逻辑运算符:&&(与)    ||(或)

定义文件:file="./lujing/wenjian.sh"

文件测试运算符:

-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。

获取当前时间:echo `date`    //返回样例:Sun Apr 25 14:54:28 CST 2021

printf:不主动换行    //使用方式:printf  格式 内容1 内容2 ... 内容n(可以有",或者',也可以直接是字符串) 

\a:警告字符,通常为ASCII的BEL字符 其实就是$

\b:后退

\c:抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略

\f:换页(formfeed)

\n:换行

\r:回车(Carriage return)

\t:水平制表符

\v:垂直制表符

\\:一个字面上的反斜杠字符

\ddd:表示1到3位数八进制值的字符。仅在格式字符串中有效

\0ddd:表示1到3位的八进制值字符

printf的格式种类:

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

范例:

$ printf "a string, no processing:<%s>\n" "A\nB"    //s是字符串,不会对字符串中的特殊字符做特殊处理

a string, no processing:<A\nB>

 

$ printf "a string, no processing:<%b>\n" "A\nB"     //b回退,即不执行>后面的\n,"A\nB"里的\n还会被当做特殊符号处理

a string, no processing:<A

B>

test 命令:用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

如:if test $[num1] -eq $[num2]    //[]中可以进行运算如num1+num2,如不需进行数字运算可以使用{}

字符串测试:=(等于则为真)    !=(不相等则为真)    -z 字符串(字符串的长度为零则为真)    -n 字符串(字符串的长度不为零则为真)

文件测试相关指令:

-e 文件名:如果文件存在则为真

-r 文件名:如果文件存在且可读则为真

-w 文件名:如果文件存在且可写则为真

-x 文件名:如果文件存在且可执行则为真

-s 文件名:如果文件存在且至少有一个字符则为真

-d 文件名:如果文件存在且为目录则为真

-f 文件名:如果文件存在且为普通文件则为真

-c 文件名:如果文件存在且为字符型特殊文件则为真

-b 文件名:如果文件存在且为块特殊文件则为真

grep -c {keyword}    //统计文件中{keyword}的个数,可以是ps -ef | grep -c "ssh" 或者grep -c "ssh" 文件名

uname -r:获取系统内核版本号

param++:正常写法${[${param}++]},简便写法let param++

说明:let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

echo -n :不换行输出

无线循环:

while不跟条件或跟true然后直接do 如while :;do ;xxx ;done或者更while true;do ;xxx ;done;或者for (( ; ; ))

until:直到    //范例:until {condition}; do ;xxx ;done

break:跳出循环

continue继续,如果是无线循环则不会结束

函数:functionName(){}    //{函数体内容}

函数中的参数传递:函数名 1 2 3 4

函数中的取参:{echo $1}

函数中的参数处理:

$#:传递到脚本或函数的参数个数

$*:以一个单字符串显示所有向脚本传递的参数

$$:脚本运行的当前进程ID号

$!:后台运行的最后一个进程的ID号

$@:与$*相同,但是使用时加引号,并在引号中返回每个参数。

$-:显示Shell使用的当前选项,与set命令功能相同。

$?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

 

 

 

 

 

 

 

 

 

 

 

 

可以当查询手册使用,因为是自己一点一点积累的,所以多要些资源分 一、各种循环命令 3 1. #WHILE循环用法 3 2. #UNTIL循环用法 3 3. #FOR循环用法: 3 二、各种条件语句 4 1. #IF语句用法 4 2. #CASE语句用法 4 语法结构 4 加select 用法 4 #select范围用法 5 3. #GOTO语句 5 4. #UNTIL循环语句 5 5. 循环控制语句 5 1.break命令 5 2.continue命令 5 三、替换命令用法 6 1. #TR 替换命令 6 2. #SED替换字符串代码 6 四、多行文件写入或注释 7 1. 多行文件写入 7 2. 多行注释方法 7 五、SHELL其它命令总结 7 1. #AWK命令用法 7 2. 搜索文件夹或文件命令 7 3. RPM解包和TAR解包 7 #rpm 强制安装 7 4. 统计某字符串数量 7 5. #DD命令使用总结 8 6. #REV 字符串反向命令 8 7. 变量截取 8 8. #UNIQ 去掉重复 8 9. #SORT 排序 8 10. 杀掉某进程 8 11. #SHELL输出TAB和空格 8 12. #PS用法 8 13. #TAIL用法 9 14. #ECHO选项 9 15. #GREP和EGREP过滤组 9 16. LS的特殊用法 9 六、LINUX SHELL其它 9 1. VI使用 9 2. 算术运算符 9 3. 字符串比较 10 4 字符串表达式(判断条件命令IF) 10 5. #SLEEP等待 10 6. #TEE执行结果复制保存 10 七、数组生成方法 10 1. #SEQ方法生成 10 2. 通过内部{BEGIN..END}生成 11 3. 以性能比较 11 4. 数组 11 八、LINUX系统常用配置方法及命令 11 1. 网卡相关的TCP/IP网络配置文件地址 11 2. #NETCONFIG命令可以永久保存设置 11 3. #NEAT或REDHAT-CONFIG-NETCONFIG可永久保存设置。 12 4. #DATE命令的使用 12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值