Shell编程学习(3)----脚本参数和控制语句的总结

本文总结了Shell编程中的脚本参数、if-then-elif-else-fi语句、for、while、until、case语句、break和continue控制以及exit语句。详细解释了参数使用、条件测试、循环控制等核心概念,帮助读者深入理解Shell脚本编程。

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

1、脚本参数

<1.>什么是脚本参数?

我们在linux中运行脚本的时候可以在脚本名后面加上一些参数,这些参数叫做脚本的位置参数,也叫作程序参数,我们简单的将其认为是脚本运行时,传递给脚本程序的参数。

 看个例子,我们写了一个脚本scp1.sh,我们在chmod  u+x  scp1(赋予uer执行脚本的权限之后),./scp1来运行脚本,这个时候如果这个脚本后面需要加一些参数,例如:./scp1 a b c ,这里的a b c就是传递的三个参数。

<2.>常用的一些参数有关符号?

$0:表示的是程序名字
$n  n属于(1-9):表示的是第1-9个参数,
第9个之后的参数用${10}、${11}来表示
$*,$@:两个表示的都是所有的参数
$#:表示的是传递的参数的个数
$?  命令执行后返回的状态,返回状态为“是”,返回0,返回状态为“否”,返回1
$! 后台运行的最后一个进程号   
$$ 当前进程号

一个例子看懂:

例:demo_arg程序如下
#! /bin/bash
echo “程序名: $0echo “命令传递参数个数:$#echo “参数值分别是:$1 $2 $3 $4 $5 $6 $7 $8 $9echo “所有参数: $@exit 0
[root@localhost root]# demo_arg a b c d e f g h i 

程序名:demo_arg
命令传递参数个数: 9
参数值分别是: a b c d e f g h i
所有参数: a b c d e f g h i

<3.>shift命令
格式:shift [n]
之前我们介绍了可以使用${10}这样的格式来使用第10个及之后的参数,我们同样也可以通过shift命令来使用第九个之后的参数。
功能:把命令行参数向左移动N个位置

看一个例子:

例: demo_shift程序如下
#! /bin/bash
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”
shift
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”
shift 3
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3exit 0
[root@localhost root]# demo_shift 1 2 3 4 5 6 7 8 9 10 11 12

结果:
程序名: demo_shift
所有参数: 1 2 3 4 5 6 7 8 9 10 11 12
前三个参数:1 2 3
程序名: demo_shift
所有参数: 2 3 4 5 6 7 8 9 10 11 12
前三个参数: 2 3 4
程序名: demo_shift
所有参数: 5 6 7 8 9 10 11 12
前三个参数: 5 6 7

<4.>set命令
set 命令为 shell 设定参数变量。许多命令的输出是以空格分隔的值,如果要使用其中的某个数据域,使用 set 非常有效。

第一个例子:
#!/bin/sh
echo the date is $(date)
set $(date)
echo the month is $2
输出:
the date is Wed Apr 23 15:34:16 CST 2014
the month is Apr

将 date 命令的输出设置为参数表,再通过位置参数 $2 取得月份。
第二个例子:
#!/bin/bash
filename="$1"
echo "filename is $filename"
set $(ls -i $filename)
innode="$1"
echo "$innode"

执行:
./scp1 test
输出:
filename is test
1184758

2、if-then-elif-else-fi语句块

if expression1
    then 
        then-commands
    elif expression2
        elif-commands
    elif expression3
        elif-commands
    ...
    else
        else-commands
fi

解释:elif相当于我们学过的else if,理论上可以有无限个eliffiif语句结构的结束标志。    

表达式:

表达式expression可以用test expression命令或[ expression ]来检测。这个命令检测一个表达式并返回true还是false。

命令语法:
test [expression]
[ expression ]

test命令可以使用的条件类型可以归为三类:字符串比较、算术比较和与文件有关的条件测试 。

<1.>字符串比较:
作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。

常用的字符串操作符:

例:从键盘读入两个字符串,判断这两个字符串是否相等,如相等输出。
(1)用vi编辑程序
[root@localhost bin]#vi test4
#!/bin/bash
read  ar1 
read  ar2 
[ "$ar1"  =  "$ar2" ]
echo $?   #保存前一个命令的返回码
(2)设置权限:
    [root@localhost bin]#chmod +x test4
(3)执行:
[root@localhost root]# ./test4 
aaa
bbb
1

注意: “[”后面和“]”前面及等号“=”的前后都应有一空格;

例: 比较字符串长度是否大于零。
(1)用vi编辑程序
[root@localhost bin]#vi test5
#!/bin/bash
read  ar
 [  -n  "$ar"  ]
echo $?   #保存前一个命令的返回码,返回状态为“是”,返回0,返回状态为“否”,返回1
(2)设置权限:
[root@localhost bin]#chmod +x test5
(3)执行:
[root@localhost root]# ./test5
0

注意: 运行结果1表示ar的长度小于等于零,0表示ar的长度大于零。

<2.>算术比较:

例: 比较两个数字是否相等。
(1)用vi编辑程序
[root@localhost bin]#vi test6
#!/bin/bash
read x y
if  test  $x  -eq  $y
   then 
      echo$x= =$yelse
      echo$x!=$yfi
(2)设置权限:

[root@localhost bin]#chmod +x test6

(3)执行:
[root@localhost bin]# ./test6
50  100
50!=100
[root@localhost bin]# ./test6
150  150
150= =150

<3.>逻辑操作:

例: 一个变量赋予一定的值,另一个为空,求两者的与、或。
(1)用vi编辑程序
[root@localhost bin]#vi test7
#!/bin/bash
part1 ="1111"
part2 =""    #part2为空
 [ "$part1"  -a  "$part2" ]
echo $?   #保存前一个命令的返回码
 [ "$part1"  -o  "$part2" ]
echo $?  

(2)设置权限:
[root@localhost bin]#chmod +x test7

(3)执行:
[root@localhost bin]# ./test7
1
0

<4.>文件条件测试
文件测试表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。

常用操作符:

例:判断zb目录是否存在/root下。
(1)用vi编辑程序
[root@localhost bin]#vi test8
#!/bin/bash
[ -d  /root/zb ]
echo $?   #保存前一个命令的返回码

(2)设置权限:
[root@localhost bin]#chmod +x test8

(3)执行:
[root@localhost bint]# ./test8
1

(4) 在/root添加zb目录
[root@localhost bin]#mkdir zb
(5)执行:
[root@localhost bin]# ./test8
0

例:
例:输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容。
[root@localhost bin]#vi test9
#!/bin/bash
echo “Please enter the directory name or file name”
read  DORF
if [ -d $DORF ]
then
  ls $DORF 
elif [ -f $DORF]
then
cat $DORF
else
  echo “input error!”
fi

3、for语句

语法:
for 变量 in 列表
 do
   操作
 done

在列表中的词被逐一赋值给变量,然后就执行操作中的命令,这通常被称为循环体。
列表中的词有多少个,在循环体中的命令就可以执行相应的次数

例: 在列表中的值:a,b,c,e,i,2,4,6,8用循环的方式把字符与数字分成两行输出。
(1)用gedit编辑脚本程序test4
[root@localhost root]# gedit test9
#!/bin/bash
for i in a,b,c,e,i   2,4,6,8
 do 
  echo $i
 done

(2)设置权限:
[root@localhost bin]#chmod +x test9

(3)执行:
[root@localhost bin]# ./test9
a,b,c,e,i
2,4,6,8

注意:在循环列表中的空格可表示换行

例:求从1100的和。
(1)用gedit编辑脚本程序test11
[root@localhost bin]# gedit test11
#!/bin/sh
total=0
for ((j=1;j<=100;j++))  #双括号不能省略,双括号的作用是:里面的语句可以像c语言一样执行
  do
     total=`expr $total + $j`
#!反引号的作用是用来将表达式转为一个值,expr用来将+号转为真正的加法运算,注意+左右要有空格!
  done
echo "The result is $total"

(2)设置权限:
[root@localhost bin]#chmod +x test11

(3)执行:
[root@localhost bin]# ./test11
The result is 5050

4、while语句

格式:

while 表达式
  do
    操作
  done
例:用while循环求1100的和。
  (1)用gedit编辑脚本程序test12
[root@localhost bin]#gedit test12
    total=0
    num=0
    while((num<=100));
    do
    total=`expr $total + $num`
   ((num+=1))
   done
   echo "The result is $total"
(2)设置权限:
    [root@localhost bin]#chmod +x test12
(3)执行:
[root@localhost bin]# ./test12
The result is 5050

5、until语句

格式:

until 表达式
do
操作
done
例:用until循环求1100的和。
(1)用gedit编辑脚本程序test13
[root@localhost bin]#gedit test13
total=0
num=0
until [ $num -gt 100 ]
do
 total=`expr $total + $num`  
 num=`expr $num + 1`
done
echo "The result is $total"
(2)设置权限:
    [root@localhost bin]#chmod +x test13
(3)执行:
[root@localhost bin]#./test13
The result is 5050

6、case语句

格式:

case 字符串 in1|值2)  操作
    ;;
值3|值4)  操作
    ;;
…
值5|值6)   操作
   ;;
esac
例:Linux是一个多用户操作系统,编写一程序根据不同的用户登录输出不同的反馈结果。
 用vi编辑脚本程序test15
[root@localhost bin]#vi test15
#!/bin/bash
case $USER in
 beichen)
   echo "You are beichen!";;
 liangnian)
   echo "You are liangnian"; //注意这里只有一个分号 
   echo "Welcome!";;  //这里才是两个分号
 root)
   echo "You are root! "; echo "Welcome!";;
    //将两命令写在一行,用一个分号作为分隔符 
 *)
   echo "Who are you?$USER?";;
esac

7、break和continue语句

break命令使得程序跳出for、while、until循环,执行done后面的语句,这样就永久终止了循环。
continue命令使得程序跳到done,这使得循环条件被再次求值,从而开始新的一次循环,循环变量取循环列表中的下一个值。。
无论哪种情况,循环体中在这两条命令后的语句都没有执行。
break命令和continue命令常作为条件语句的一部分来使用。

8、exit语句

exit命令使脚本程序结束运行,退出码为n。

语句语法:exit n

在任何一个交互式shell的命令提示符中使用这个命令,它都会让你退出系统。
如果在退出时不指定一个退出状态,那么该脚本中最后一条被执行命令的状态将被用作返回值。
在shell脚本编程中,退出码0表示成功,退出码1~125是脚本程序使用的错误代码。其余数字具有保留含义

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值