【Linux】shell编程基本知识
作者:互联网
【Linux】shell编程基本知识--lhr
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程序控制结构语句
正则表达式
变量的运算
Shell中变量没有明确的类型,变量值都以字符串的形式存储。
算术运算需要使⽤命令将变量中的字符串转换为数值。Shell中的运算⼀般通过两个命令实现:let
和expr
。
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" ]
测试类型:
- 文件测试
- 字符串测试
- 数值测试
文件测试
字符串测试
例如:
[ "$s1" = "$s2" ]
test "$s1" = "$s2"
数值测试
例如:
[ "$s1" -gt 10 ]
test "$s1" -gt 10
- 用逻辑操作符进行组合的测试语句
例如:0<a<10且a<>5
[ \( "$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语句特点:
- 各正则表达式是唯一的,不应重复出现。
- case语句以关键字case开头,以关键字esac结束。
- 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 "$a“
done
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对命令解析过程
标签:语句,10,shell,基本知识,echo,命令,Linux,7.5 来源: https://blog.csdn.net/dive668/article/details/119059762