shell程序设计

本文详细介绍了Shell编程的基础知识,包括基本元素、脚本创建与执行、shell结构、特殊符号、内部变量、条件判断、文件测试、字符串测试、重定向及IO管理。通过示例解析了命令行交互与脚本编写中的常见操作,帮助读者掌握Shell编程技能。

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

1、shell基本元素

a、#! /bin/bash  必须的,指出shell类型(ash,bash,ksh,csh,zsh)

b、#  注释

c、变量

d、控制

2、创建和执行脚本文件

a、用任何编辑器比如vi在文本文件中编写脚本,以.sh为后缀名保存文件。
b、将文件赋予可执行的权限
c、执行脚本命令:
     1)bash 脚本文件
     2)./脚本文件 

注意:文件开头指定一个或多个解释脚本程序的shell,如  #!/bin/bash
如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。
不指定的话一般默认以/bin/sh执行shell脚本

3、shell的一般结构

shell类型

函数

主过程

一般模板  abc.sh
#!  /bin/bash         shell类型
#a simple shell script example
#a function
sayhello()                函数
{
    echo "Enter Your name:"
    read name          读取来自键盘输入的变量
    echo "Hello $name"
}
echo "programme starts here..."  主过程
sayhello
echo "programme ends."

4、shell中的特殊符号

a、注释符# 
    除了#!/bin/bash里的#特殊
b、美元符 $
    变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如$a表示变量a的值。变量字符长度超过1个时,用{}括起来
c、单引号
    被引起的字符全部做普通字符,即全部原样
 echo ‘my $SHELL’
d、双引号
    引号内的内容,除$、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
e、倒引号(数字1键旁边的那个键)
    引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
    `pwd`             即pwd命令的执行结果
           $LOGNAME        系统变量
区别下面几句:
    echo ‘my home is $HOME’
    echo “my home is $HOME”
    echo  `my home is $HOME`
 
    echo “my home is `pwd`”
    echo ‘my home is `pwd`’
f. 反斜线
     反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。、
    echo  “Filename  is  N0\$\`”

5、shell中部分内部变量

$#    传送给shell程序的位置参数的数量
$?     最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0     shell程序的名称
$*     调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$n     第n个参数

6、条件判断命令

test n1 -参数 n2       (或 –参数 表达式)       [ n1 -参数 n2 ]
    真返回0,假返回1。 
参数:
    -lt 小于
    -le小于等于
    -gt  大于
    -ge 大于等于
    -eq 等于
    -ne 不等于
 
test语句的等价形式[ 1 –lt 4 ]
可用中括号代替test,把表达式括起来实现判断
注意表达式与中括号间有空格。
 
test 1 –lt 4  #判断1<4
echo $?        #结果为0
7、文件测试

-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
如:test -d “mydoc”  [ -d "mydoc" ]
判断mydoc是否是目录


 eg:检测从命令行输入的文件是否存在
if [ $# -ne 1 ]
then 
    echo "usage -$0 file-name"
    exit 1
fi
 
if [ -f $s1 ]
then
    echo "$1 file exit"
else
    echo "$1 file does not exit"

8、字符串测试

=: 等于则为真
!=:不相等则为真
-z字符串:字符串长度为零则为真
-n字符串:字符串长度不为零则为真

-a 并且    -o 或者    !非

与或非
&&  ||   !
 -a   -o   !

9、命令结果重定向

0 stdin 标准输入
1 stdout标准输出
2 stderr标准错误
 
输出重定向到文件file,终端上只能看到标准错误:
#命令 >file
错误重定向到文件file ,终端上只能看到标准输出:
#命令 2>file
标准输出和标准错误都重定向到file,终端上看不到任何信息:
#命令 >file 2>&1
(等于#命令 1>file 2>&1)

10、屏蔽任何命令的输出

cp /etc/my.conf  >/dev/null  2>&1
/dev/null  空设备
此句命令的结果是:
cp命令没有目标文件,应该输出错误。 
2>&1表示错误重定向指向标准输出。
>/dev/null又使标准输出重定向到空,就是不要输出信息
即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出。
 
1)command >file 2>file
2)command >file 2>&1 
有什么区别? 
    1)的写法,stdout和stderr都直接送到file中, 会出现两个同抢占file的管道,file会被打开两次,stdout和stderr输出的信息会互相覆盖。
    2)的写法将stdout直接送向file, stderr继承1的管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
    从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,常用command > file 2>&1 这样的写法。 

11、IO重定向

$ cat < file > file 文件內容会被洗掉 
$ cat  file 此处会没有内容
 stdout、stderr 的管道先准备好才会从 stdin读内容
 > file 会先清空 file,然後才读进 < file ,但此时file已被清空,
因此再重定位读进file的为空
最后cat显示的file就成空了

12、计算命令的开始到结束之间的时间

time find /etc -name "passwd" 2>/dev/null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值