Shell编程(/bin/sh和/bin/bash)

本文介绍了Shell脚本的基础知识,包括保留字符的意义、变量类型及使用方法、条件测试命令、表达式处理以及流程控制等内容。

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

转载自  Shell编程(/bin/sh和/bin/bash)

保留字符及其含义

shell变量

条件测试命令

表达式

流程控制

参考资料


查看ubuntu支持的Shell:

    
$ cat / etc / shells

查看当前shell:

    
$ echo $SHELL

 

以下是sh Shell脚本编程,也适用于bash,差异之处已说明。

保留字符及其含义

$ shell变量名的开始,如$var

| 管道,将标准输出转到下一个命令的标准输入

# 注释开始

& 在后台执行一个进程

? 匹配一个字符

* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)

$- 使用set及执行时传递给shell的标志位

$! 最后一个子进程的进程号

$# 传递给shell script的参数个数

$* 传递给shell script的参数

$@ 所有参数,个别的用双引号括起来

$? 上一个命令的返回代码

$0 当前shell的名字

$n (n:1-) 位置参数

$$ 进程标识号(Process Identifier Number, PID)

>file 输出重定向

`command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`

>>fiile 输出重定向,append

其他:

$$dir

ls > filelist

ls >> filelist

wc -l < filelist

wc -l filelist

sleep 5; echo 5 seconds reaches; ls -l

ps ax |egrep inetd

find / -name core -exec rm {} \; &

filename=`date "+%Y%m%d"`.log

 

shell变量

Shell有如下四种变量:

.用户自定义变量

.位置变量即 shell script之参数

.预定义变量(特殊变量)

.环境变量

(1)用户自定义变量(数据的存储)

    
$ COUNT = 1 $ NAME = " He Binwu "
$ echo $NAME
$ echo ${NAME}

技巧:因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。

变量的调用:在变量前加$。

使用unset命令删除变量的赋值。

    
$ Z = hello $ echo $Zhello $ unset Z $ echo $Z $

在变量未赋值之前其值为空。Bourne Shell允许对变量设置默认值(相当于C#中 ?? 表达式),其格式如下:

${variable:-defaultvalue}

例:

复制代码
    
$ echo Hello $UNAME Hello $ echo Hello ${UNAME: - there} Hello there $ echo $UNAME #变量值并未发生变化 there $ UNAME = hbwork $ echo Hello ${UNAME: - there} Hello hbwork
复制代码

另一种情况:改变变量的值,格式如下:

${variable:=value}

    
$ echo Hello $UNAME Hello $ echo Hello ${UNAME: = there} Hello there $ echo $UNAME #变量值并未发生变化 there

变量替换中使用命令替换:

    
echo ${MYDIR} #输出空 echo ${MYDIR: - `pwd`}
输出:
/ home / pxl / shelltest

在变量已赋值时进行替换:

复制代码
    
MYTEST = pxl echo ${MYTEST} echo ${MYTEST: + " changevalue " } echo $MYTEST 输出: pxl changevalue pxl
复制代码

带有错误检查的有条件变量替换:

    
echo ${UNAME:? " UNAME has not been set " } echo ${UNAME } #如果上一句判断错误,这里不会执行
输出:
./test.sh: 17: UNAME: UNAME has not been set

(2)位置变量(Shell参数)

在shell script中位置参数可用$1..$9表示,$0表示内容通常为当前执行程序的文件名。

可以使用shift [n] 来删出指定前n个参数,n默认为1.

复制代码
    
脚本 test.sh
shift shift 2 echo $ 1
echo $0
执行: $ . / test.sh a b c d e 输出: d
./test.sh
复制代码

 

条件测试命令

(1)数值测试:

-eq :等于则为真。
-ne :不等于则为真。
-gt :大于则为真。
-ge :大于等于则为真。
-lt :小于则为真。
-le :小于等于则为真。

(2)字串测试:
= :等于则为真。
!= :不相等则为真。
-z字串 :字串长度伪则为真。
-n字串 :字串长度不伪则为真。

(3)文件测试:
-e文件名 :如果文件存在则为真。
-r文件名 :如果文件存在且用户有读权限则为真。
-w文件名 :如果文件存在且用户有写权限则为真。
-x文件名 :如果文件存在且用户有可执权限行则为真。
-s文件名 :如果文件存在且至少有一个字符(大小不为零)则为真。
-d文件名 :如果文件存在且为目录则为真。
-f文件名 :如果文件存在且为普通文件则为真。
-c文件名 :如果文件存在且为字符设备文件则为真。
-b文件名 :如果文件存在且为块设备文件则为真。

 

表达式

(1) 与、或、非

&& :与

|| :或

!  : 非(需要有空格)

(2) expr命令

expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument

其中operator为+ - * / %, 但对*的使用要用转义符\。

复制代码
    
v1 = 3 v2 = 2 v3 = `expr $v1 \ * $v2` echo $v3
输出:
6
复制代码

 

    
# 适用于/bin/bash,不适用于/bin/sh v1 = 3 v2 = 2 v3 =$ [v1 * v2] echo $v3

 

流程控制

(1) if 条件语句

复制代码
    
if [ - f " $file " ] ; then newfile = `echo " $file " | sed " s/${OLD}/${NEW}/g " ` if [ - f " $newfile " ]; then      echo " ERROR: $newfile exists already " else echo " renaming $file to $newfile ... " mv " $file " " $newfile " fi fi
复制代码

 

(2) for 循环

复制代码
    
for file in $* ; do if [ -f " $file " ] ; then newfile = `echo " $file " | sed " s/${OLD}/${NEW}/g " ` if [ -f " $newfile " ]; then      echo " ERROR: $newfile exists already " else echo " renaming $file to $newfile ... " mv " $file " " $newfile " fi fi done
复制代码

 

复制代码
    
for n in 9 8 7 6 5 4 3 2 1 ; do if [ -f " $filen.$n " ]; then p = `expr $n + 1 ` echo " mv $filen.$n $filen.$p " mv $filen . $n $filen . $p fi done
复制代码

 

    
# 适用于/bin/bash,不适用于sh for ((i = 1 ;i< = 10 ;i ++ )); do echo $i done

 

(3) while 循环

    
while [ - n " $1 " ]; do echo $1 shift done

 

(4) case 条件

复制代码
    
while [ - n " $1 " ]; do case $1 in - h) help;shift 1 ;; # function help is called -f ) opt_f = 1 ;shift 1 ;; # variable opt_f is set - l) opt_l = $2 ;shift 2 ;; # -l takes an argument -> shift by 2 -- ) shift; break ;; # end of options -* ) echo " error: no such option $1. -h for help " ;exit 1 ;; * ) break ;; esac done
复制代码

<think>好的,我需要为用户解释bash shell/bin/bash的区别。首先,我要明确用户的问题,他们可能对这两个术语感到困惑,或者想了解它们之间的关系。 首先,我应该从基本定义开始。bash shell是一种Unix shell,也就是命令行解释器,用户通过它与操作系统交互。而/bin/bashbash shell的可执行文件路径,通常在Unix-like系统中。 接下来,我需要区分术语的不同使用场景。当人们说“bash shell”时,通常指的是整个交互环境,包括语法、命令、功能等。而/bin/bash则更具体,指的是硬盘上的那个程序文件,用于启动bash shell。 然后,可能需要解释环境变量默认shell的设置。比如,用户可以通过chsh命令更改默认shell到/bin/bash或其他shell。这里要说明/bin/bash作为路径的重要性,以及如何影响用户的登录环境。 还要考虑版本问题。不同系统中的/bin/bash可能有不同版本,用户需要知道如何检查版本号,比如使用bash --version。同时,可能存在的符号链接,比如/bin/sh指向bash的情况,需要简要说明兼容性。 另外,实际应用中的例子会有帮助。比如在脚本中指定shebang为#!/bin/bash,这样系统就知道用哪个解释器来执行脚本。同时,在终端中输入bash命令会启动一个新的bash会话,这依赖于/bin/bash的存在。 需要确保语言通俗易懂,结构清晰,分点说明。同时检查是否存在技术错误,比如路径是否正确,术语是否准确。还要注意用户可能的问题,比如如何确定自己正在使用的shell,可以通过echo $SHELL或echo $0命令。 最后,总结两者的关系:bash shell是软件名称,而/bin/bash是该软件在系统中的具体位置。这样的总结能帮助用户明确概念,避免混淆。</think>Bash Shell与/bin/bash的区别联系可以从以下角度理解: ### 一、基础定义 1. **Bash Shell** 全称"Bourne-Again SHell",是Unix/Linux系统中的命令行解释器,功能包括: - 执行用户输入的命令(如`ls`/`grep`) - 支持脚本编程 - 提供管道/重定向等特性 - 具备历史记录自动补全功能 2. **/bin/bash** 是bash shell的可执行文件存储路径: ```bash $ ls -l /bin/bash -rwxr-xr-x 1 root root 1234376 Jun 18 2020 /bin/bash ``` 该文件是操作系统启动bash shell的二进制程序 ### 二、核心差异 | 特征 | bash shell | /bin/bash | |-----------|------------------|----------------------| | 本质 | 软件名称 | 可执行文件路径 | | 存在形式 | 抽象概念 | 具体的二进制文件 | | 作用 | 提供交互式环境 | 作为程序的物理载体 | | 版本查询 | `bash --version` | `file /bin/bash` | ### 三、实际应用场景 1. **修改默认shell** 通过`chsh`命令将用户shell设置为/bin/bash: ```bash chsh -s /bin/bash ``` 2. **脚本开发** 在脚本首行声明解释器路径: ```bash #!/bin/bash echo "Hello World" ``` 3. **会话启动** 终端中输入`bash`命令时,系统实际执行: ```bash exec /bin/bash ``` 4. **版本兼容检查** 验证系统bash版本: ```bash $ /bin/bash --version GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu) ``` ### 四、特殊注意事项 1. **符号链接情况** 某些系统中存在: ```bash /bin/sh -> bash ``` 此时`/bin/sh`实际调用bash的POSIX兼容模式 2. **多版本共存** 开发服务器常见配置: ```bash /usr/local/bin/bash # 手动安装的新版本 /bin/bash # 系统默认版本 ``` 3. **环境变量验证** 查看当前shell路径: ```bash echo $SHELL # 显示默认shell echo $0 # 显示当前会话使用的shell ``` ### 五、架构示意图 ``` 用户输入命令 ↓ /bin/bash (解析执行) ↓ Linux内核(处理系统调用) ↓ 硬件操作 ``` 总结:Bash shell是软件功能描述,/bin/bash是软件实体在文件系统中的存储位置,二者是同一事物的不同存在形态。理解这种关系有助于解决脚本兼容性、shell环境配置等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值