Linux的shell编程

1、shell基本语法

shell脚本第一行必须以 #!/bin/sh 开头。

 

1.1、shell程序的变量和参数

对shell来讲,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值。

 

1.1.1、shell定义的环境变量

shell在开始执行的时候就已经定义了一些和系统的工作环境相关的变量,这些变量用户还可以重新定义。

HOME用户保存注册目录的完全路径名。
PATH用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文档将被执行。
TERM终端的类型。
UID当前用户的识别字。
PWD当前工作目录的绝对路径,该变量的取值随cd命令的使用而变化。
PS1主提示符,在root用户下,默认的是#,在普通用户下,默认是$。
PS2在shell接收用户输入的命令过程中,如果用户在输入行末尾输入“/”然后回车,或者当用户按回车键时shell判断用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“>”。

 

1.1.2、用户定义变量

变量名=变量值

1、在定义变量时,变量名前不应加$,在引用变量的内容时,则应该在变量名前加$。

2、在给变量赋值时,等号两边一定不能有空格,若变量本身就包含了空格,则整个字符串都要用双引号括起来。

定义常量        readly 变量名

定义公用变量  export 变量名

export命令可以将一个局部变量提供给shell执行的其它命令使用,在shell以后运行的所有命令或程序中都可以访问到。

 

1.1.3、位置参数

在调用shell程序的命令行中按照各自的位置决定的变量。

$1、$2,依次类推

$0是一个特殊变量,它是当前这个shell程序的文件名,所以$0不是一个位置参数。在显示当前所有位置参数时,不包括$0

 

1.1.4、预定义变量

预定义变量和环境变量类似,也是在shell一开始时就定义了变量。不同的是,用户者能使用预定义变量,而不能重定义它。所有预定义变量都是由$符号和另一个符号组成的。

$#位置参数的变量
$*所有位置参数的内容
$? 命令执行后返回的状态(用于检查上一个命令是否执行正确,linux中,命令退出状态0表示正确,任何非0表示命令出错)
$$ 当前进程的进程号(最常见的用途是用作暂存文件的名字以保证暂存文件不会重名)
$! 后台运行的最后一个进程号
$0当前执行的进程名

 

1.1.5、参数置换变量
变量=${参数-word} 如果设置了参数,则参数的值替换变量值,否则,用word置换
变量=${参数=word}变量置换成word后,参数也替换成word。位置参数不能使用这种方式
变量=${参数?word}如果设置了参数,则用参数的值替换变量的值,否则显示word并从shell中退出,如果省略了word,则显示标准资讯(长用于出错提示)
变量=${参数+word} 如果设置了参数,则用word置换,否则不置换

 

1.2、流程控制

1.2.1、测试命令
1.2.1.1、数值测试
-eq 等于为真
-ne不等于为真
-gt大于为真
-ge 大于等于为真
-lt  小于为真
-le 小于等于为真

 

1.2.1.2、字符串测试
=等于为真
!= 不等于为真
-z 字符串 字符串长度伪则为真
-n 字符串字符串长度不伪则为真

 

1.2.1.3、文件测试
-e 文件名如果文件存在为真
-r 文件名如果文件存在并且可读为真
-w 文件名如果文件存在并且可写为真
-x 文件名如果文件存在并且可执行为真
-s 文件名如果文件存在并且至少有一个字符则为真
-d 文件名如果文件存在且为目录则为真
-f 文件名如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名如果文件存在且为块特殊文件则为真

 

1.2.1.4、与或非
-o
-a

! 最高  -a 其次  -o 最低

 
1.2.1.5、算数运算

var1=2

var2=$[var1*10+1]

var2的值为21

 

1.2.2、if条件语句

if 条件1; then

     命令1

elif 条件2; then

     命令2

else

     命令3

fi

 

1.2.3、for循环

for 变量名 [in 数值列表]

do

    若干命令行

done

for 变量名 in 文件正则表达式

do

    若干命令行

done

for i in $*

do

    若干命令行

done

 

1.2.4、while循环

while 判断真假

do

    若干命令行

done

为真时继续执行

 

1.2.5、until循环

until 判断真假

do

    若干命令行

done

为假时继续执行

 

1.2.6、case条件选择

case 变量 in

字符串1)

     命令列表1

     ;;

字符串2)

     命令列表2

     ;;

字符串n)

     命令列表n

     ;;

*)

     其它命令行

esac

 

1.2.7、无条件控制语句

break

continue

 

1.2.8、函数定义
1.2.8.1、定义

funcitonName {

    若干命令行

}

 

1.2.8.2、调用

funcitonName param1 param2 ……

在函数定义时不用带参数,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应的位置参数

 

1.2.9、命令分组

分组方法“()”和“{}”

当shell执行()中的命令时将再创建一个新的子进程,这个子进程进去执行()中的命令。如果用户在执行命令时不想让命令运行时对状态集合,如环境变量、当前工作目录等的改变影响到下面语句的执行时,就应该把这些命令放到()中,这样就可以保证所有改变只会对子进程产生影响,不会对父进程产生任何干扰。

{}用于将顺序执行的命令的输出结果用于另一个命令的输入。

注:当我们真正需要使用“()”和“{}”时,则需要在其前面加上转义符号/,以便让shell知道它们不是用于命令执行的控制所用。

 

1.2.10、信号

trap命令???

 

1.3、shell程序的执行方法

sh shell程序文件名

用chmod命令使shell文件具有可执行权限

 

1.4、bash程序的调试

bash -参数 shell程序文件名

常用参数

-e如果一个命令失败就立即退出(shell默认情况下,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束,如果未重定向,则错误信息会显示在屏幕上,而shell程序仍将继续执行)
-n读入命令但是不执行它们
-u使用未赋值变量时退出程序并显示错误信息(shell默认设置允许使用未赋值的变量)
-vshell在执行程序过程中,把它读入的每一个命令行都显示出来
-xshell在执行程序过程中,把它执行的每一个命令在行首用一个+加上命令名显示出来,并且把每一个变量和该变量的值也显示出来

上面的选项也可以在shell程序内部用“set -常用参数”的形式引用,而“set +常用参数”则将禁止该选择项起作用。

 

1.5、bash的内部命令

echo -n(不换行) arg在屏幕上打印出arg指定的字符串
eval args当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行
exec 命令 命令参数当shell程序执行到exec语句时,不会去创建新的子程序,而是转去指定命令,当指定命令执行完毕,该进程终止,exec后面的语句将不再执行
export 变量名
export 变量名=值
shell可以用export把它的变量向下带入子shell程序而让子进程继承父进程中的环境变量,但shell不能用此命令把它的变量带入父shell
注:不带任何变量的export则将显示出当前所有的export变量
readonly 变量名定义常量,不带变量的readonly则显示出所有常量
read -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 变量名表从标准输入设备读入一行,分解成若干字,赋值给shell程序内部定义的变量。
shift
shift 跳转数字
使用此命令将位置参数向左移动一个位置,并使位置参数$#减一,直到减到0
waitshell等待后台启动的所有子进程结束,wait的返回值总是真
exit退出shell程序,在exit后可选择一个数作为返回状态。如 exit 0
. shell程序文件名使shell读入指定的shell程序文件,并依次执行文件中的所有语句
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值