linux 内建命令(二) shift命令

本文深入探讨bash中shift命令的使用方式、原理及其在处理不确定数量参数时的应用实例,包括参数循环处理、数学描述与实际操作演示。

shift 命令时bash的内建命令.

命令的使用:

     对于某个命令行参数,其参数个数可以不固定,但是可以通过$*或$@进行循环操作。(注释:$@,$* 表示所有参数的列表.$#表示参数的个数.)

若用户要求Shell在不知道变量个数的情况下,还能逐个处理参数,也就是在$1之后是$2,$2之后是$3。在未运行shift命令之前$1是可用的,当使用shift命令之后,原来的$2会变成$1,并且原有的$1变得不可用,通过$#命令获得的参数个数也会少1。我的理解是可以将所有的参数看成是在一个数组中,最开始的指针指向第一个参数,调用shift,相当于调用循环数组的next函数,将指针指向下一个元素,那么当前元素就是第二个元素.

shift [n]这里是可以带参数的.

官方文档是这样的:位置参数从n+1 被命名为为$1,参赛在$#-n+1的以下的都被unset(释放了.)其中 n必须是非负数.并且小于等于$#.

如果n=0,没有参数被改变.如果n没有指定,默认是1.如果n>$#,位置参数也不会被改变.

如果n>$# || n < 0 返回值大于0.

这里的官方文档通过数学的语言来描述,其实和上面的类似.

下面我们还是用例子来说明比较有说服力.

#!/bin/sh
echo "all parameters count:"$#
echo "all parameters"
echo $@
until [ $# -eq 0 ]
do
    echo "the first parameter is :$1 and parameters count :$#"
    shift 1
done

这里的输入命令./shift.sh 2 3 4 6

all parameters count:4

all parameters

2 3 4 6

the first parameter is :2 and parameters count :4

the first parameter is :3 and parameters count :3

the first parameter is :4 and parameters count :2

the first parameter is :6 and parameters count :1

我们知道,$1-$9能够代表9个参数.$0代表文件名本身.

这里可以解决一个问题,如果是参数多余9个呢.shift 就能帮上大忙了.


另外的一个例子:

#!/bin/sh

function usage(){

  echo "usage:`basename $0` [-l|-u] file..." >&2

  exit 1

}

if [ $# -eq 0 ];then

     usage

fi

while [ $# -ne 0 ]

do 

    case $1 in

        -l|-L)  echo "-l or -L is specified"

          ;;

        -u|-U) echo "-u or -U is specified"

          ;;

        *)    usage

          ;;

       esac

done


这里的结果大家应该猜测得到了.就不贴出来了. 





                
<think>首先,用户的问题是:"我想了解Linux下的内建命令和外部命令的区别及列举",并指定了"内建命令vs外部命令列表及区别"。我需要根据提供的引用内容来回答。引用内容概述:-引用[1]:区分内部命令(如cd、source、fg)和外部命令(如ls、cat)。内部命令在shell中内置,执行速度快,因为不创建新进程;外部命令在单独文件中,执行时创建新进程。可以用"help"命令获取bashshell的内置命令列表。-引用[2]:使用type命令区分(如typecd显示"cdisashellbuiltin")。内部命令性能更好,避免外部命令能优化脚本性能。举例:求和时用内部命令代替外部命令。-引用[3]:类似引用[1],强调外部命令在独立文件中执行时创建新进程。关键点:-**区别**:-**内部命令**:在shell自身中实现,执行时不创建新进程(快速),例如cd、source。-**外部命令**:在文件系统中的可执行文件中实现,执行时创建新进程(稍慢),例如ls、cat。-**如何查看**:在bash中,用"typecommand"命令看是否builtin或用路径。-**性能**:内部命令快,因为无进程创建开销。-**列表**:可以用"help"命令获取内部命令列表;外部命令在标准路径中。需要提供列表:-根据引用[1],内部命令列表可用"help"命令获取。在bashshell中,执行"help"会列出内置命令。-常见内部命令:引用提到cd,source,fg;其他如echo,read,for等。-常见外部命令:ls,cat,grep,mv,cp等,通常存放于/bin,/usr/bin等目录。结构化回答:1.**解释区别**:清晰定义内部命令和外部命令,参考引用。2.**列举示例**:提供一些常见命令的例子。3.**如何区分**:使用type命令或which命令。4.**性能影响**:解释为什么内部命令更优。5.**列表**:给出获取内部命令列表的方法;外部命令无固定列表,可通过路径列出。6.**总结**:强调实践中不需要过度在意,但在优化脚本时考虑。回答结构遵循用户要求:-使用中文回答。-对于命令名和代码,使用inlineformat或代码块。-结构清晰,帮助用户逐步理解。-末尾自然添加引用标识:[^1],[^2],[^3]。生成相关问题:-系统级指令要求"生成相关问题",所以需在回答后添加相关问题。-相关问题应基于主题,如:如何获取内部命令列表?性能优化技巧?常见误解?完整回答框架:-引言:简要解释主题。-区别详解:对比内部和外部命令。-列举方法:如何获取列表,并给出一些常见命令。-区分方法:type命令例子。-性能讨论:为什么内部命令快。-结语:实践建议。-相关问题:添加2-3个相关问题。具体内容:-**区别**:-内部命令:内置在shell中,不需执行文件,快速执行。-外部命令:独立的可执行文件,创建新进程执行。-**举例**:-内部命令:cd,echo,source,fg,help,exit-外部命令:ls,cat,grep,find,pwd-**查看方法**:-使用`type`命令:`typecd`→"cdisashellbuiltin";`typels`→"lsis/bin/ls"-内部命令列表:在bash中,运行`help`或`compgen-b`-**性能**:内部命令减少进程创建开销,提升脚本效率。如引用[2]提到,在脚本中优先使用内部命令。-**列表**:内部命令列表可通过"help"命令获取。常见内部命令包括:alias,bg,cd,command,compgen,complete,declare,dirs,echo,enable,eval,exec,exit,export,fc,fg,getopts,hash,help,history,jobs,kill,let,local,logout,mapfile,popd,printf,pushd,pwd,read,readarray,readonly,return,set,shift,shopt,source,suspend,test,times,trap,type,typeset,ulimit,umask,unalias,unset,wait。-外部命令:所有非内置命令,位于/bin,/usr/bin等。-**引用**:在相关部分末尾加[^1],[^2],[^3]。相关问题建议:1.如何在脚本中优先使用内部命令以优化性能?2.Linux中有哪些常见的内置命令,如何管理它们?3.外部命令的优势是什么,例如在可移植性方面?确保回答真实可靠:基于标准Linux/bash知识。</think> ### Linux 内建命令 vs 外部命令的区别及列表 以下是针对您问题的详细解答。Linux 中的命令分为内部命令(Internal Commands)和外部命令(External Commands),两者在实现机制、执行效率和用途上有明显差异。我会逐步解释这些区别,并列举常见命令列表。解答基于引用内容[^1][^2][^3],结合Linux标准知识。 #### 1. 内建命令和外部命令的核心区别 - **内部命令内建命令)**: - 这些命令是**直接构建在Shell(如Bash、Zsh)内部**的,不需要独立文件支持。 - 执行时**不创建新进程**,直接由Shell解释执行。 - 优点:执行速度快、开销小,因为减少了进程创建和切换的开销。适合频繁使用的命令或脚本优化。 - 缺点:缺乏可移植性,因为命令随Shell不同而变化。 - 例如:当执行`cd`时,只是修改当前工作目录,无新进程生成 [^1]。 - **外部命令**: - 这些命令是**独立的可执行文件**,通常存储在文件系统中(如 `/bin`, `/usr/bin`)。 - 执行时**必须创建新进程**(通过`fork()`和`exec()`系统调用),然后加载并运行该文件。 - 优点:更灵活、可扩展性强(可以添加新命令或替换版本)。易于跨系统使用。 - 缺点:执行速度相对慢,因为有进程创建和文件加载的开销。 - 例如:执行`cat`时,Shell会从路径 `/bin/cat` 加载文件并创建新进程运行 [^1][^3]。 - **关键比较点**: | **特性** | **内部命令** | **外部命令** | |---------------|----------------------------------|----------------------------------| | 实现位置 | Shell内部(无需独立文件) | 文件系统路径(如 `/bin`) | | 执行机制 | 不创建新进程,直接执行 | 创建新进程并加载文件 | | 执行速度 | 非常快(无进程开销)[^2] | 较慢(有进程创建开销) | | 依赖性 | 依赖Shell类型 | 依赖文件系统路径 | | 获取列表方法 | 用`help`或`compgen -b`(Bash) | 用`ls /bin`或`which`命令 | #### 2. 如何区分内部和外部命令 - 使用`type`命令:它能报告命令的类型。 ```bash type cd # 输出: cd is a shell builtin [^2] type cat # 输出: cat is /bin/cat [^3] ``` - 在脚本优化中,优先使用内部命令能提升性能(如避免外部命令的进程创建) [^2]。 #### 3. 常见命令列表 以下列表基于引用内容和Linux常见命令整理。内部命令依赖于Shell(如Bash),列表会因Shell不同而异;外部命令因发行版(如Ubuntu、CentOS)路径不同。 - **内部命令列表(以Bash为例)**: - 如何获取完整列表:在终端运行`help`命令(显示所有内置命令)或`compgen -b`(输出内置命令名)。 - 常见内部命令(部分列举): - `cd`: 更改当前目录(快速执行)。 - `source` 或 `.`: 加载并执行脚本文件(内部处理)。 - `echo`: 输出文本(比外部版本高效)。 - `fg`/`bg`: 控制作业的前台/后台执行。 - `help`: 显示帮助信息(内置)。 - 其他:`alias`, `exit`, `export`, `read`, `pwd`, `type`, `umask`。 - 完整列表可运行`help`查看 [^1]。内部命令的优势在脚本中尤为明显,例如求和操作`z=$((x+y))`内部比调用外部命令如`bc`更快 [^2]。 - **外部命令列表**: - 无固定列表:所有命令如果不在Shell内置中,就是外部命令。 - 常见外部命令(部分列举): - `ls`: 列出目录内容(通常位于 `/bin/ls`)。 - `cat`: 显示文件内容(如 `/bin/cat`)。 - `grep`: 文本搜索工具。 - `mv`/`cp`/`rm`: 文件操作命令。 - `find`: 搜索文件系统。 - `ps`: 显示进程信息。 - `ping`/`ssh`: 网络工具。 - 如何检查:用`which command`或`type -a command`(例如`which ls` 可能输出 `/usr/bin/ls`) [^1][^3]。 #### 4. 性能和使用建议 - **为什么性能重要**: 内部命令由于无进程开销,在高频脚本中能显著提高效率(如循环或频繁调用时)。例如,在Bash脚本中优先使用内部`echo`而非外部`/bin/echo` [^2]。 - **实践建议**: - 优化脚本: 尽量用内部命令(如用内置算术`$((...))`替代调用`expr`)。 - 可移植性: 外部命令更适合跨Shell或系统使用(如脚本在Dash和Bash间共享)。 - 混合使用: 许多命令有内部版本(如`echo`),但某些环境提供外部版本以增加功能 [^2][^3]。 在Linux日常使用中,不需要过度关注区别,但如果涉及性能敏感的脚本或资源受限环境(如嵌入式系统),理解这点能帮助优化 [^1][^2]。 ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值