关于 Shell 脚本的经典十三问

关于 Shell 脚本的经典十三问

1、为何叫做 Shell?

我们知道计算机的运作离不开硬件,但却无法直接操作硬件,硬件的驱动只能通过一种称之为“操作系统(OS,Opertating System)的软件来管控。Linux 严格来说是一个操作系统(OS)。

使用者没有办法直接操作 Kernel,而是通过 Kernel 的“外壳”程序,也就是所谓的 Shell 来与 Kernel 沟通。Shell 是一个使用者与系统的交互界面(Interface),只能通过命令行(Command line)来使用系统来完成工作。因此 Shell 最简单的定义就是:命令解译器(Command Interpreter)

将使用者的命令翻译给内核处理;

同时,将内核处理结果翻译给使用者。

不同的 OS 使用不同的 Kernel;同一个 kernel 之上,也可以使用不同的 Shell,常见的 Shell 有sh、bash、csh、ksh 等

2、Shell prompt(PS1)与 Carriage Return(CR)的关系?

成功登录一个 Shell 终端后,光标左边部分称之为提示符 Prompt,通常一般用户使用$,管理员用户使用#

Shell Prompt:可以输入命令了,键入命令后,直到读进 CR(Carriage Return)字符为止

Carriage Return:可以执行命令了

若从技术的细节来看,Shell 会依据 IFS(Internal Field Seperator)将 Command line 所输入的文字拆解为”字段”(word/field)。然后再针对特殊字符(meta)先作处理,最后重组整行command line。

3、别人echo,你也echo,试问 echo 知多少?

echo 将 argument送到标准输出(stdout),通常显示在屏幕

stdin 标准输入
stdout 标准输出
stderr 标准错误输出

echo -n  # 取消换行符echo -e  # 启用反斜杠转译

登录后复制

4、双引号””与单引号”有什么区别?

hard quote:”(单引号),关闭所有引用

soft quote:””(双引号),保留$引用

5、var=value? export 前后差在哪?

变量定义:name=value,等号左右两边不能使用分隔符。

变量替换:echo ${name}

export变量:export name=value,使变量成为环境变量

# 本地变量A=B# 取消变量unset A# 环境变量export A=B

登录后复制

6、exec 跟 source 差在哪?

环境变量只能从父进程到子进程单向传递。换句话说:在子进程中环境如何变更,均不会影响父进程的环境。
当我们执行一个shell script时,其实是先产生一个sub-shell的子进程, 然后sub-shell再去产生命令行的子进程。关注Linux中文社区

# 创建子shell执行脚本./1.sh# 当前shell执行source 1.sh# 当前shell执行后退出exec 1.sh

登录后复制

7、( ) 与 { } 差在哪?

( )将 command group 置于 sub-shell 执行
{ }则是在同一个shell内完成

8、$(()) 与 $() 还有 ${} 差在哪?

# 假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt# 我们可以用 ${ } 分别替换获得不同的值:# 1. shell字符串的非贪婪(最小匹配)左删除${file#*/} # 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt# 2. shell字符串的贪婪(最大匹配)左删除${file##*/} # 拿掉最后一条 / 及其左边的字符串:my.file.txt${file##*.} # 拿掉最后一个 . 及其左边的字符串:txt# 3. shell字符串的非贪婪(最小匹配)右删除:${file%/*} # 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3${file%.*} # 拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file# 4. shell字符串的贪婪(最大匹配)右删除:${file%%/*} # 拿掉第一条 / 及其右边的字符串:(空值)${file%%.*} # 拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my记忆的方法为:# 是去掉左边(在键盘上 # 在 $ 之左边)% 是去掉右边(在键盘上 % 在 $ 之右边)单一符号是最小匹配﹔两个符号是最大匹配。

登录后复制


# 5. shell字符串取子串:${file:0:5}:提取最左边的 5 个字节:/dir1${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2# 6. shell字符串变量值的替换:${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt# 7. ${}还可针对变量的不同状态(没设定、空值、非空值)进行赋值:${file-my.file.txt} :假如 $file 没有设定,则使用 my.file.txt 作传回值。(空值及非空值时不作处理) ${file:-my.file.txt} :假如 $file 没有设定或为空值,则使用 my.file.txt 作传回值。(非空值时不作处理)${file+my.file.txt} :假如 $file 设为空值或非空值,均使用 my.file.txt 作传回值。(没设定时不作处理)${file:+my.file.txt} :若 $file 为非空值,则使用 my.file.txt 作传回值。(没设定及空值时不作处理)${file=my.file.txt} :若 $file 没设定,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。(空值及非空值时不作处理)${file:=my.file.txt} :若 $file 没设定或为空值,则使用 my.file.txt 作传回值,同时将 $file 赋值为 my.file.txt 。(非空值时不作处理)${file?my.file.txt} :若 $file 没设定,则将 my.file.txt 输出至 STDERR。(空值及非空值时不作处理)${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt 输出至 STDERR。(非空值时不作处理)tips:以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态.一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.

登录后复制


# 8. 计算shell字符串变量的长度:${#var}${#var} 可计算出变量值的长度:${#file} 可得到 27 ,因为 /dir1/dir2/dir3/my.file.txt 刚好是 27 个字节...# 9. bash数组(array)的处理方法数组:A=(a b c d)引用数组:${A[@]}${A[*]}访问数组成员${A[0]}计算数组长度${#A[@]}${#A[*]}数组重新赋值A[2]=xyz# 10.$(( ))是用来做整数运算的 a=5;b=7;c=2;echo $(( a + b * c))

登录后复制

9、$@ 与 $* 区别在哪?

“$@”则可得到 “p1” “p2 p3” “p4” 这三个不同的词段

“$*”则可得到 “p1 p2 p3 p4” 这一整串单一的词段

另外,搜索公众号Linux就该这样学后台回复“git书籍”,获取一份惊喜礼包。‍

10、&& 与 || 差在哪?

1、test命令有两种形式

test expression

[ expression ]

2、bash的test目前支持三种测试对象

string:字符串

integer:整数

file:文件

3、当 expression 为真是返回 0(true) ,否则返回 非0(false)

command1 && command2  command2 只有在 command1 的RV为0(True)的条件下执行。

command1 || command2  command2只有在command1的RV为非0(False)的条件下执行。

4、先替换变量再比较

A=123[ -n "$A" ] && ([ "$A" -lt 100 ] || echo "too big")unset A

登录后复制

11、> 与

0: Standard Input(STDIN)
1: Standard Output (STDOUT)
2: Standard Error Output(STDERR)

我们可用

我们可用 > 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案。

ls my.file no.such.file 1> file.out 2>file.err# 2>&1 就是将stderr并进stdout做输出ls my.file no.such.file 1> file.out 2>&1# /dev/null 空ls my.file no.such.file >/dev/null 2>&1cat  file# 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。# 也就是说,在上例中,> file 会先将 file 清空,然后才读进 

12、你要if还是case呢?

# ifecho -n "Do you want to continue?(Yes/No):"read YNif [ "$YN"=Y -o "$YN"=y -o "$YN"="Yes" -o "$YN"="yes" -o "$YN"="YES"];thenecho "continue"elseexit 0fi# caseecho -n "Do you want to continue?(Yes/No):"read YNcase "$YN" in[Yy]|[Yy][Ee][Ss])echo "continue";;*)exit 0esac

登录后复制

13、for what? while与until差在哪?

# forfor ((i=1;i

登录后复制

break 是结束 loop

return 是结束 function

exit 是结束 script/shell

以上就是关于 Shell 脚本的经典十三问的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3239685.html

(0)
上一篇 2025年4月2日 05:01:05
下一篇 2025年4月2日 05:01:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Linux LAMP如何监控运行状态

    要监控linux lamp(linux, apache, mysql, php)环境的运行状态,可以使用多种工具和方法。以下是一些常用的监控工具和方法: 1. 使用原生Linux命令 top命令:用于实时显示系统中各个进程的资源占用状况,如…

    互联网 2025年4月29日
    000
  • Kafka在Linux环境下的监控方法

    本文介绍多种在Linux环境下监控Apache Kafka的方法,助您全面掌握Kafka集群的性能和状态。 一、基于JMX的监控 JConsole: Java自带的监控工具,可直接连接Kafka Broker,实时监控吞吐量、延迟、磁盘利用…

    2025年4月29日
    000
  • 如何用SecureCRT批量处理Linux任务

    使用securecrt批量处理linux任务可以通过以下几种方法实现: 使用Shell脚本 编写Shell脚本:你可以编写Shell脚本来实现自动化任务和批量处理作业。例如,使用find命令遍历服务器上的配置文件,并使用sed命令批量修改文…

    2025年4月29日
    000
  • copendir函数在Linux中的替代方案

    在linux系统中,如果你发现cop*log*dir函数不可用或者需要寻找其他替代方案,以下是一些可行的方法: 1. 使用opendir和readdir 这两个函数属于POSIX标准库,专门用于遍历目录内容。 #include #inclu…

    2025年4月29日
    000
  • Linux SFTP如何实现自动化任务

    在linux系统中,使用sftp(ssh文件传输协议)来实现自动化任务可以通过多种方式进行。以下是一些常见的实现方法: 1. 使用 sftp 命令和脚本 你可以编写一个shell脚本来自动化SFTP任务。下面是一个简单的示例: #!/bin…

    2025年4月29日
    000
  • Linux FTPServer如何实现自动化部署

    在linux系统上实现ftpserver的自动化部署可以通过多种方式进行,以下是几种常见的途径: 使用vsftpd和脚本实现自动化 安装vsftpd: sudo apt-get install vsftpd # 适用于基于Debian的系统…

    2025年4月29日
    000
  • 如何在CentOS上实现自动化运维

    centos自动化运维方案详解:ansible、puppet、chef及shell脚本 本文介绍几种在CentOS系统中实现自动化运维的常用方法,包括Ansible、Puppet、Chef以及Shell脚本和Cron任务调度。选择哪种方法取…

    编程技术 2025年4月29日
    000
  • 解决PremierePro安装过程中出现的错误代码

    解决premiere pro安装错误代码的方法包括:1. 错误代码1:以管理员身份运行安装程序,确保系统满足最低要求。2. 错误代码16:检查并确保网络连接稳定,尝试使用不同网络下载安装包。3. 错误代码23:重新下载安装包,检查文件完整性…

    2025年4月29日
    000
  • 更改IIS默认安装路径的操作步骤

    更改iis默认安装路径是为了提高安全性和管理灵活性。步骤包括:1. 停止iis服务,2. 移动iis文件到新路径,3. 更新配置文件,4. 重新启动iis服务。确保备份数据并在测试环境验证。 引言 在处理服务器配置时,常常会遇到需要更改II…

    2025年4月29日
    000
  • 如何查看已安装的IIS版本信息

    查看iis版本可以通过以下方法:1. 打开iis管理器,点击“帮助”,选择“关于internet information services”查看版本。2. 在powershell中使用命令get-windowsfeature -name w…

    2025年4月29日
    000

发表回复

登录后才能评论