【Linux】shell编程基本知识

【Linux】shell编程基本知识--lhr

    • 前言补充
      • shift使用
      • 循环遍历输入的不确定数目的参数的方法
      • 7.2.1 shell环境变量
    • 7.4 shell编程中的输入输出命令
    • 7.5 shell程序控制结构语句
      • 变量的运算
    • 7.5 shell程序控制结构语句
      • 7.5.1 测试语句
        • 文件测试
        • 字符串测试
        • 数值测试
      • 7.5.2 if语句
        • 【例7.7】编写一个shell脚本,查找给定的某用户是否在系统中工
        • 【例7.8】编写一个shell脚本,利用位置参数携带一个文件名,
        • 【例7.9】编写一个shell脚本,输入(1-10)之间的一个数,并判断它是否小于5。
      • 7.5.3 case语句
        • 【例7.11】case语句的通配符及多个模式组合实例。
      • 7.5.4 for语句
        • 【例7.12】将指定的值用for循环依次输出。
        • 【例7.13】将当前目录下的所有*.c文件信息用for循环依次输出。
        • 【例7.14】编写shell脚本,第一个位置参数为指定的目录,其后指定的位置参数为第一个位置参数指定目录下的文件,显示这些文件的内容。
      • 7.5.5 while语句
        • 【例7.15】编写程序,这段程序对各个给定的位置参数,首先判断其 是否是普通文件,若是,则显示其内容;否则,显示它不是文件名的信息。
        • 【例7.16】利用while循环输出0到10之间的整数。
      • 7.5.7 break和continue语句
        • 【例7.18】用while和break输出1-10之间的整数
        • 【例7.19】输入一组数,输出除了值为3的所有数。
      • 7.5.8 算术表达式和退出脚本程序命令
      • 7.5.9 自定义函数
    • Linux可执行文件种类
    • Shell对命令解析过程

前言补充

————————————————
版权声明:本文为CSDN博主「SogK1997」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dive668/article/details/119164392
————————————————

shift使用

Linux shell脚本中shift的用法说明

循环遍历输入的不确定数目的参数的方法

7.2.1 shell环境变量

只读的环境变量

  • 特殊的环境变量

特殊的环境变量值是系统预先定义好的,用户不能重新设置。

  • 常见的只读环境变量

$$——当前进程的进程ID(PID)
$?——最后执行的一条命令的退出状态,返回值为0则成功, 非0则失败
$!——在后台运行的最后一个进程的进程ID
$# ——传送给shell程序的位置参数的数量
$0——shell程序的名称 即第一个参数
$*——调用shell程序时所传送的全部参数成的单字符串

7.4 shell编程中的输入输出命令

shell中输⼊输出的标准⽂件
每个进程运⾏时⾃动打开三个⽂件,这些⽂件称为命令的标准⽂件,分别⽤于命令读取输⼊、输出结果以及输出错误消息,即

  • 标准输⼊⽂件(stdin)
    终端输入(文件编号为0,默认:键盘)
  • 标准输出⽂件(stdout)
    将打印数据到终端(文件编号为1,默认:显示器)
  • 标准错误输出⽂件(stderr)
    文件编号2,默认: 显示器

常用命令

  • read命令
    用read命令由标准输入读取数据,然后赋给指定的变量。
  • echo 命令
    echo命令是将其后的参数输出。最好用双引号把所有参数括起来,这样不仅易读并且能使shell对它们进行正确的解释。
  • export 环境变量的设定或者创建
export	NAME=value	//Name成为环境变量

标准变量也是环境变量,在bash环境建⽴时⽣成,该变量⾃动解析,通过查看etc⽬录下的profile⽂件可以查看系统中的标准环境变量;使⽤env命令可以查看系统中的环境变量,包括环境变量和标准变量
实例:

env
set #看已经定义的变量

7.5 shell程序控制结构语句

正则表达式
【Linux】shell编程基本知识_第1张图片

变量的运算

Shell中变量没有明确的类型,变量值都以字符串的形式存储。
算术运算需要使⽤命令将变量中的字符串转换为数值。Shell中的运算⼀般通过两个命令实现:letexpr
let命令可以进⾏算术运算和数值表达式测试,let命令的使⽤格式如下:

  • let 表达式
    例如: i=1;let i=i+1; echo “i=$i”
    let命令也可以使⽤如下形式代替:((算术表达式))
i=1; echo “i=$((i+3))
  • Expr 表达式:
expr  数学表达式	//expr 3+5

7.5 shell程序控制结构语句

脚本的控制结构语句有三种基本的类型:

  • 两路分支: Linux的bash中的两路分支语句是if语 句
  • 多路分支:多路分支语句是if-elif和case语句;
  • 一个或多个命令的循环执行:代码的循环执行语
    句是for、while和until语句。

7.5.1 测试语句

测试语句是shell的特有功能,和各种条件语句来结合使用。
在shell中使用测试语句来计算判断条件的值。测试语句计算一个表达式的值并返回“真”或“假”。
格式:

  • 使用关键字test
test expression 例如: test –f "$1"
  • 使用方括号
[ expression ] 例如: [ -f "$1" ]

测试类型:

  • 文件测试
  • 字符串测试
  • 数值测试

文件测试

【Linux】shell编程基本知识_第2张图片

字符串测试

【Linux】shell编程基本知识_第3张图片
例如:

[ "$s1" = "$s2" ]
test "$s1" = "$s2"

数值测试

【Linux】shell编程基本知识_第4张图片
例如:

[ "$s1" -gt 10 ]
test "$s1" -gt 10
  • 用逻辑操作符进行组合的测试语句
    【Linux】shell编程基本知识_第5张图片
    例如:05
[ \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5 ] 
test \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5

7.5.2 if语句

两路分支的if语句格式:

if 判断条件
then 命令1
else 命令2
fi

判断条件包括命令语句和测试语句两种方式:
命令语句形式的判断条件

【例7.7】编写一个shell脚本,查找给定的某用户是否在系统中工

作。如果在系统中就发一个问候给他。

#!bin/sh
echo "type in the user name"
read user
if who|grep $user
then echo "hello! $user!"|write $user
else echo "$user has not logged in the system"
fi

测试语句形式的判断条件:

【例7.8】编写一个shell脚本,利用位置参数携带一个文件名,

判断该文件在当前目录下是否存在且是一个普通文件。

#!bin/sh
if test -f "$1"
then echo "$1 is an ordinary file"
else echo "$1 is not an ordinary file"
fi
  • 多路条件判断分支的if语句
    格式为:
if 判断条件1
then 命令1
elif 判断条件2
then 命令2
……
else 命令n
fi

其中elif是else if的缩写

【例7.9】编写一个shell脚本,输入(1-10)之间的一个数,并判断它是否小于5。

echo 'key in a number (1 - 10 ) :'
read a
if [ "$a" -lt 1 –o "$a" -gt 10 ]
then echo " Error Number . "
exit
elif [ ! "$a" –lt 5 ]
then echo " It's not less 5 . "
else echo " It's less 5 . "
fi

7.5.3 case语句

对同一变量进行多次的测试,比elif语句更简单、简洁

case string1 in
str1)
	commands-list1;;
str2) 
	commands-list2;;
...
strn)
	commands-listn;;
esac

含义:将stringl和strl…strn比较。如果strl和strn中的任何一个和string1相符合,则执行其后的命令一直到两个分号(;;)结束。如果没有符合的,则其后的语句不被执行。

使用case语句时应注意以下几点:

  • (1) 每个正则表达式后面可有一条或多条命令,其最后一条命令必须以两个分号(;;)结束。
  • (2) 正则表达式中可以使用通配符。
  • (3) 如果一个正则表达式是由多个模式组成,那么各模式之间应以竖线“|”隔开。表示各模式是“或”关系,即只要给定字符串与其中一个模式相配,就会执行其后的命令表。

case语句特点:

  1. 各正则表达式是唯一的,不应重复出现。
  2. case语句以关键字case开头,以关键字esac结束。
  3. case的退出(返回)值是整个结构中最后执行的那个命
    令的退出值。若没有执行任何命令,则退出值为零。

【例7.11】case语句的通配符及多个模式组合实例。

case $1 in
[dD]ate) echo "the date is `date`";;
dir|path) echo "current directory is `pwd`";;
*) echo "bad argument";;
esac

7.5.4 for语句

格式:

for variable [in argument-list]
do
	command-list
done

其中的[in argument-list]部分为可选项,由于它的不同又可有三种形式:
1、[argument-list]为变量值表
变量variable依次取值表中各字符串

【例7.12】将指定的值用for循环依次输出。

for a in 1 2 3 4 5
do
	echo "$adone

2、[argument-list]为文件的表达式
变量的值依次取当前目录(或指定目录)下与文件表达式相匹配的文件名,每取值一次,就进入循环体执行命令表,直到所有匹配的文件名取完为止。

【例7.13】将当前目录下的所有*.c文件信息用for循环依次输出。

for i in *.c 
do 
	ls $i
done

3、[argument-list]为空
实际是用$*来代替,变量依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。

【例7.14】编写shell脚本,第一个位置参数为指定的目录,其后指定的位置参数为第一个位置参数指定目录下的文件,显示这些文件的内容。

dir=$1;shift
if [ -d $dir ]
then cd $dir
	for name #依次取位置参数的值
	do
		if [ -f $name ]
		then cat $name
			echo "End of ${dir}/$name"
		else echo "Invalid file name : ${dir}/$name"
		fi
	done
else echo "Bad directory name:$dir"
fi

7.5.5 while语句

格式为:

while expression
do
	command-list
done

作用:只要expression的值为真,则进入循环体,执行command- list中的命令,然后再做条件测试,直到测试条件为假时才终止while语句的行。

【例7.15】编写程序,这段程序对各个给定的位置参数,首先判断其 是否是普通文件,若是,则显示其内容;否则,显示它不是文件名的信息。

while [ $1 ]
do
	if [ -f $1 ]
	then echo " display : $1 "
		cat $1
	else echo " $1 is not a file name . "
	fi
	shift
done

【例7.16】利用while循环输出0到10之间的整数。

x=1
while [ $x -le 10 ]
do 
	echo $x
	x=`expr $x + 1`
done

7.5.7 break和continue语句

break命令可以从循环体中退出来。格式为:

break [n]

continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。格式为:

continue [n]

【例7.18】用while和break输出1-10之间的整数

x=1
while true
do
	echo $x
	x=`expr $x + 1`
	if [ "$x" -gt 10 ]
	then break
	fi
done

【例7.19】输入一组数,输出除了值为3的所有数。

for i in 1 2 3 4 5
do
	if [ " $i" –eq 3 ]
	then continue
	else echo " $i "
	fi
done

7.5.8 算术表达式和退出脚本程序命令

五种基本的算术运算:+(加)、-(减)、*(乘)、/(除)和%(取模)。shell只提供整数的运算。格式如下:

expr n1 运算符 n2
expr 15 \* 15

注意:在运算符的前后都留有空格,否则expr不对表达式进行计算,而直接输出它们。
退出脚本程序命令:

exit [n]

其中n为设定的退出值,如果未给定n的值,则退出值为最后一个命令的执行状态。

7.5.9 自定义函数

在shell脚本中可以定义并使用函数。其定义格式为:

function( )
{ 
	command-list
}

函数应先定义,后使用。调用函数时,直接利用函数名调用。

Linux可执行文件种类

  • Linux命令:用来使系统执行某种操作的指令,存放在/bin和/sbin目录下;
  • 内置命令:存放于Shell内部的命令的解释程序,是一些常用的命令。可以使用“type 命令名”的方式来查看某个命令是否为内置命令
  • 实用程序:存放于/usr/bin、/usr/sbin、/usr/local/bin等目录下的程序,如ls、which等;
  • 用户程序:由用户编写的,经过编译后可执行的文件;
  • Shell脚本:使用Shell语言编写的批处理文件。

Shell对命令解析过程

【Linux】shell编程基本知识_第6张图片

你可能感兴趣的:(linux,linux,shell)