问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux入门学习笔记——Shell命令

发布网友 发布时间:2024-09-26 07:07

我来回答

1个回答

热心网友 时间:2024-10-04 23:00

Shell命令1. Shell 简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

2. Shell 变量2.1 定义变量

例如:your_name="piggy"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

中间不能有空格,可以使用下划线?_。

不能使用标点符号。

不能使用bash里的关键字(可用help命令查看保留关键字)。

2.2 使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可。

your_name="cat"echo?$your_name

已定义的变量,可以被重新定义。

2.3 只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

2.4 删除变量

使用unset变量可以删除变量。

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

2.5 变量类型

1) 局部变量?局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量?所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量?shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。

3. Shell 字符串

字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号字符串的*:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:

双引号里可以有变量

双引号里可以出现转义字符

3.1 拼接字符串your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!3.2 获取字符串长度string="abcd"echo?${#string}??????#?输出?43.3 提取子字符串string="runoob?is?a?great?site"echo?${string:1:4}??????#?输出?unoo3.4 查找子字符串查找字符?**i**?或?**o**?的位置(哪个字母先出现就计算哪个):string="runoob?is?a?great?site"\echo?`expr?index?"$string"?io`??#?输出?4

注意: ?以上脚本中?`?是反引号,而不是单引号?'。

4. Shell 数组4.1 定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为: 数组名=(值1 值2 ... 值n)

例如:array_name=(value0 value1 value2 value3)

或者

array_name=(value0value1value2value3)

还可以单独定义数组的各个分量:

array_name[0]=value0array_name[1]=value1array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有*。

4.2 读取数组

一般格式是:${数组名[下标]}

例如:v=${array_name[n]}

使用?@?符号可以获取数组中的所有元素,例如:echo ${array_name[@]}

4.3 获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

#?取得数组元素的个数length=${#array_name[@]}#?或者length=${#array_name[*]}#?取得数组单个元素的长度lengthn=${#array_name[n]}5. Shell 注释

单行注释:以?#?开头

多行注释:

:<<EOF注释内容...注释内容...注释内容...EOF:<<'注释内容...注释内容...注释内容...'6. Shell 传递参数

在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为: $n。n?代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推。 | 参数格式 | 说明 | | ---- | --------| | $# ? | 传递到脚本的参数个数 | | $ ? | 以一个单字符串显示所有向脚本传递的参数 | | $$ ? | 脚本运行的当前进程ID号 ?| | $! ? | 后台运行的最后一个进程的ID号 ?| | $@ ? | 与$相同,但是使用时加引号,并在引号中返回每个参数 | | $- ? | 显示Shell使用的当前选项,与set命令功能相同 | | $? ? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

7. Shell 数组

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

7.1 读取数组

${array_name[index]}

7.2 获取数组中的所有元素

使用@ 或 * 可以获取数组中的所有元素,例如:

array[0]=Aarray[1]=Barray[2]=Carray[3]=Decho?"数组的元素为:?${array[*]}"echo?"数组的元素为:?${array[@]}"7.3 获取数组的长度your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!08. Shell 运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

算数运算符

关系运算符

布尔运算符

字符串运算符

文件测试运算符

原生bash不支持简单的数*算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号?`?而不是单引号?' )

your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!1

表达式和运算符之间要有空格

完整的表达式要被 ` 包含

8.1 算术运算符运算符说明举例+加法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

注意:

条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

乘号(*)前边必须加反斜杠\才能实现乘法运算

8.2 关系运算符运算符说明举例-eq检测两个数是否相等,相等返回 true[ $a -eq $b ] 返回?false-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 ] 返回 true8.3 布尔运算符运算符说明举例!非运算,表达式为 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 ] 返回?false8.4 逻辑运算符运算符说明举例&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false//逻辑的 OR[[ $a -lt 100 // $b -gt 100 ]] 返回 true8.5 字符串运算符运算符说明举例=检测两个字符串是否相等,相等返回 true[ $a = $b ] 返回 false!=检测两个字符串是否不相等,不相等返回 true[ $a != $b ] 返回?true-z检测字符串长度是否为0,为0返回 true[ -z $a ] 返回 false-n检测字符串长度是否不为 0,不为 0 返回 true[ -n "$a" ] 返回 true$检测字符串是否为空,不为空返回 true[ $a ] 返回?true8.6 文件测试运算符操作符说明举例-b file检测文件是否是块设备文件,如果是,则返回 true[ -b $file ] 返回 false-c file检测文件是否是字符设备文件,如果是,则返回 true[ -c $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 ] 返回?true9. Shell echo命令9.1 显示普通字符串your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!29.2 显示转义字符your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!39.3 显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量。

your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!49.4 显示换行your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!59.5 显示不换行your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!69.6 显示结果定向至文件your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!710. Shell printf命令

printf 使用引用文本或空格分隔的参数,外面可以在?printf?中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像?echo?自动添加换行符,我们可以手动添加?\n。

printf 命令的语法:printf ?format-string ?[arguments...]

your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!8printf 的转义序列序列说明\a警告字符,通常为ASCII的BEL字符\b后退\c抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略\f换页\n换行\r回车(Carriage return)\t水平制表符\v垂直制表符\一个字面上的反斜杠字符\ddd表示1到3位数八进制值的字符。仅在格式字符串中有效\0ddd表示1到3位的八进制值字符11. Shell test命令

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

11.1 数值测试参数说明-eq等于则为真-ne不等于则为真-gt大于则为真-ge大于等于则为真-lt小于则为真-le小于等于则为真11.2 字符串测试参数说明=等于则为真!=不相等则为真-z 字符串字符串的长度为零则为真-n 字符串字符串的长度不为零则为真11.3 文件测试参数说明-e 文件名如果文件存在则为真-r 文件名如果文件存在且可读则为真-w 文件名如果文件存在且可写则为真-x 文件名如果文件存在且可执行则为真-s 文件名如果文件存在且至少有一个字符则为真-d 文件名如果文件存在且为目录则为真-f 文件名如果文件存在且为普通文件则为真-c 文件名如果文件存在且为字符型特殊文件则为真-b 文件名如果文件存在且为块特殊文件则为真12. Shell 函数

shell中函数的定义格式如下:

your_name="run"#?使用双引号拼接greeting="hello,?"$your_name"?!"greeting_1="hello,?${your_name}?!"echo?$greeting??$greeting_1#?使用单引号拼接greeting_2='hello,?'$your_name'?!'greeting_3='hello,?${your_name}?!'echo?$greeting_2??$greeting_3输出:hello,?run?!?hello,?run?!hello,?run?!?hello,?${your_name}?!9

注意:

函数返回值在调用该函数后通过 $? 来获得。

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。 参数处理 | 说明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| | ---- | ------------------------------- | | $# ? | 传递到脚本或函数的参数个数 ? ? ? ? ? ? ? ? ? | | $ ? | 以一个单字符串显示所有向脚本传递的参数 ? ? ? ? ? ? | | $$ ? | 脚本运行的当前进程ID号 ? ? ? ? ? ? ? ? ? ?| | $! ? | 后台运行的最后一个进程的ID号 ? ? ? ? ? ? ? ? | | $@ ? | 与$相同,但是使用时加引号,并在引号中返回每个参数 ? ? | | $- ? | 显示Shell使用的当前选项,与set命令功能相同 ? ? | | $? ? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

原文:https://juejin.cn/post/7101098366871797773

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
预算2000内的手机2000元以内双核手机 我女儿被摩托车一撞伤后,骑车人逃逸了,记住车牌号报警后,找到车主... ...擦车事件.给钱私了对方写了协议书和收据.但肇事局把车拖走了... 我被摩托车撞了对方是全责,头部还缝了六针,我可以要求赔偿多少?_百度... 对方醉酒驾摩托车撞伤家人,现在想出院静养,赔偿事宜该怎么协商,应该赔 ... 摩托车追尾我家人的车,摩托车司机骨折,交警扣了我家的车 现在需要我们... outlook 资料怎么转移到其他电脑上 正规废镍回收联系方式 手机用音乐播放器那个更好? 哪种播放器音质最好 十二生肖中谁是四王 吃了两次避孕药月经会推迟多久 海贼王中的四王是哪4个啊?有没有能力的啊? 成龙演唱会请过的出自星光大道的人叫什么? 处女座女生和金牛座男生般配吗 “那瀑布从上面冲下仿佛已被扯成大小的几绺。”这句话运用了什么修辞... 温良忍让打一数字 温良忍让打一生肖 温良忍让打最佳生肖 温良忍让什么生肖? 身体的皮下长了脂肪瘤怎么办 好累的,想到很多事,那又怎样,再多事也改变不了要继续生活? ...我爱的人离我而去,长这么大连个谈心的人都没有,爸爸妈妈不爱我,每... 本田电子手刹故障灯闪是什么原因? 从2003年11月13号到2022年12月5号有多少时间 win7系统无法自动更新、更新失败的解决方法 电脑提示更新失败怎么办? 微计算机应用期刊介绍 2021年5月20日到2022年12月28日是多少天? 2021年5月18日到2022年12月10中间一共多少天 浅析shell脚本工作原理 湿疹膏的副作用 湿疹膏要涂多久才能好-百科/常识 宝宝奶癣可以用宝宝湿疹膏吗 宝宝湿疹擦什么 男十六,记忆力差,反应慢,逻辑思维能力差,不会表达,又看不进去书。怎么... ...钻牛角尖,反应慢,逻辑思维差,理解力差,记忆力差,不会想问题,同时又... 萍水相逢未必三生有幸,歌舞升平定能动人心弦是什么意思?求简单和详细... ...个人站在云上,左下在云上的是犬右下在云上的是只鸡是什么成_百度知... 一幅上画有一个人踩在云上一只鸟儿,旁边儿的一个小动物,猜四个字 一个人在云上,地上一只蚂蚁猜成语 中国唯一一个以人名命名的城市 以人名命名的城市国外有哪些以人名命名的城市 千纸鹤的寓意? 现在太阳周围有个大圈你们看见了吗?是怎么回事? “太阳公公出来了它对我两笑呀笑”这是出自哪首歌的歌词 歌词有、太阳公公出来了、的歌名是什么? 求一首歌里面歌词是太阳公公出来了,它对我呀笑呀笑。。。很蓝调的一首... “我要变强”的日文翻译 求日文翻译一句话! 求越前龙马.. 我要变得更强.. 的日文书写..罗马拼音..