目录
1、为何叫做 Shell?" >1、为何叫做 Shell?
2、Shell prompt(PS1)与 Carriage Return(CR)的关系?" >2、Shell prompt(PS1)与 Carriage Return(CR)的关系?
3、别人echo,你也echo,试问 echo 知多少?" >3、别人echo,你也echo,试问 echo 知多少?
4、双引号""与单引号''有什么区别?" >4、双引号""与单引号''有什么区别?
5、var=value? export 前后差在哪?" >5、var=value? export 前后差在哪?
6、exec 跟 source 差在哪?" >6、exec 跟 source 差在哪?
10、&& 与 || 差在哪?" >10、&& 与 || 差在哪?
8、$(()) 与 $() 还有 ${} 差在哪?" >8、$(()) 与 $() 还有 ${} 差在哪?
9、$@ 与 $* 区别在哪?" >9、$@ 与 $* 区别在哪?
11、> 与 < 差在哪?" >11、> 与 < 差在哪?
12、你要if还是case呢?" >12、你要if还是case呢?
13、for what? while与until差在哪?" >13、for what? while与until差在哪?
首页 运维 linux运维 关于 Shell 脚本的经典十三问

关于 Shell 脚本的经典十三问

Aug 03, 2023 pm 03:03 PM
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:''(单引号),关闭所有引用&#39;&#39;(单引号),关闭所有引用

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

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

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

  • 变量替换:echo ${name}

  • 🎜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)

    我们可用 < 来改变读进的数据信道(stdin),使之从指定的档案读进。

    我们可用 > 来改变送出的数据信道(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>&1
    
    cat < file > file
    # 在 IO Redirection 中,stdout 与 stderr 的管道会先准备好,才会从 stdin 读进资料。
    # 也就是说,在上例中,> file 会先将 file 清空,然后才读进 < file , 
    # 但这时候档案已经被清空了,因此就变成读不进任何数据了
    登录后复制

    12、你要if还是case呢?

    # if
    echo -n "Do you want to continue?(Yes/No):"
    read YN
    if [ "$YN"=Y -o "$YN"=y -o "$YN"="Yes" -o "$YN"="yes" -o "$YN"="YES"];then
    echo "continue"
    else
    exit 0
    fi
    
    # case
    echo -n "Do you want to continue?(Yes/No):"
    read YN
    case "$YN" in
    [Yy]|[Yy][Ee][Ss])
    echo "continue"
    ;;
    *)
    exit 0
    esac
    登录后复制

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

    # for
    for ((i=1;i<=10;i++))
    do
    echo "num is $i"
    done
    
    # while
    num=1
    while [ "$num" -le 10 ]; do
    echo "num is $num"
    num=$(($num + 1))
    done
    
    # until
    num=1
    until [ "$num" -gt 10 ]; do
    echo "num is $num"
    num=$(($nu + 1))
    done
    登录后复制
    • break 是结束 loop

    • return 是结束 function

    • exit 是结束 script/shell

    以上是关于 Shell 脚本的经典十三问的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    如何在Linux系统中执行.sh文件? 如何在Linux系统中执行.sh文件? Mar 14, 2024 pm 06:42 PM

    如何在Linux系统中执行.sh文件?在Linux系统中,.sh文件是一种被称为Shell脚本的文件,用于执行一系列的命令。执行.sh文件是非常常见的操作,本文将介绍如何在Linux系统中执行.sh文件,并提供具体的代码示例。方法一:使用绝对路径执行.sh文件要在Linux系统中执行一个.sh文件,可以使用绝对路径来指定该文件的位置。以下是具体的步骤:打开终

    如何将ESD文件转换为ISO格式 如何将ESD文件转换为ISO格式 Feb 19, 2024 am 08:37 AM

    esd文件是Windows操作系统中使用的一种压缩格式,而ISO文件是一种光盘映像文件,用于创建光盘副本或虚拟光驱。当我们需要将esd文件转换为iso文件时,可能是因为ISO文件更常用,更易于使用。下面将为您介绍一些常用的方法来完成这个转换过程。方法一:使用ESDDecrypterESDDecrypter是一款专门用于将esd文件解密并转换为iso文件的

    Linux根文件系统的秘密 Linux根文件系统的秘密 Feb 15, 2024 pm 01:42 PM

    Linux是一种开源、可移植、可定制的操作系统,它广泛应用于各种领域,如服务器、桌面、嵌入式设备等。Linux的核心是内核,它负责管理硬件资源和提供基本的服务。但是,内核并不是一个独立的实体,它需要一个文件系统来存储和访问各种数据和程序。文件系统是一种组织和管理文件的方法,它定义了文件的名称、位置、属性、权限等信息。在Linux中,有许多不同类型的文件系统,如ext4、xfs、btrfs等,它们各有特点和优势。但是,在所有的文件系统中,有一个特殊的文件系统,它是Linux系统的基础和核心,它就是

    Linux快速删除文件末尾行的操作步骤 Linux快速删除文件末尾行的操作步骤 Mar 01, 2024 pm 09:36 PM

    Linux系统下在处理文件时,有时候需要删除文件末尾的行。这种操作在实际应用中很常见,可以通过一些简单的命令来实现。本文将介绍在Linux系统中快速删除文件末尾行的操作步骤,同时提供具体的代码示例。步骤一:查看文件末尾行在进行删除操作之前,首先需要确认文件的末尾行是哪一行。可以使用tail命令来查看文件的末尾行,具体命令如下:tail-n1filena

    为何无法在Windows 7上执行bat文件 为何无法在Windows 7上执行bat文件 Feb 19, 2024 pm 03:19 PM

    为什么win7不能运行bat文件最近,许多使用Windows7操作系统的用户反映他们无法运行.bat文件。这引发了广泛的讨论和疑惑。为什么一个良好运行的操作系统不能运行一个简单的.bat文件呢?首先,我们需要了解一下.bat文件的背景。.bat文件,也称为批处理文件,是一种纯文本文件,包含了一系列的命令,这些命令可以被Windows命令解释器(cmd.ex

    如何使用PowerShell自动执行任务 如何使用PowerShell自动执行任务 Feb 20, 2024 pm 01:51 PM

    如果您是IT管理员或技术专家,您一定意识到自动化的重要性。尤其对于Windows用户来说,MicrosoftPowerShell是最佳的自动化工具之一。微软为满足您的自动化需求提供了各种工具,无需安装第三方应用程序。本指南将详细介绍如何利用PowerShell自动化执行任务。什么是PowerShell脚本?如果您有使用PowerShell的经验,您可能已经使用过命令来配置您的操作系统。脚本是.ps1文件中这些命令的集合。.ps1文件包含由PowerShell执行的脚本,例如基本的Get-Help

    面向初学者的Windows PowerShell脚本教程 面向初学者的Windows PowerShell脚本教程 Mar 13, 2024 pm 10:55 PM

    我们为初学者设计了这份WindowsPowerShell脚本教程,无论您是技术爱好者还是希望提高脚本编写技能的专业人士。如果你对PowerShell脚本没有先验知识,这篇文章将从基础开始,为您量身定制。我们将帮助您掌握PowerShell环境的安装步骤,并逐步介绍PowerShell脚本的主要概念和功能。如果您已经做好准备,准备深入学习PowerShell脚本编程,那么让我们一起踏上这激动人心的学习之旅吧!什么是WindowsPowerShell?PowerShell是由微软开发的一个混合了命令

    url文件怎么打开 url文件怎么打开 Mar 28, 2024 pm 06:27 PM

    使用URL文件打开互联网资源的方法包括:使用网络浏览器双击打开。使用文本编辑器打开,复制链接地址并粘贴到浏览器地址栏。通过命令行,使用“start”或“open”命令指定URL文件路径。创建脚本文件,包含打开URL文件的命令。

    See all articles