————————————————
版权声明:本文为CSDN博主「SogK1997」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dive668/article/details/119164392
————————————————
Linux shell脚本中shift的用法说明
只读的环境变量
特殊的环境变量值是系统预先定义好的,用户不能重新设置。
$$——当前进程的进程ID(PID)
$?——最后执行的一条命令的退出状态,返回值为0则成功, 非0则失败
$!——在后台运行的最后一个进程的进程ID
$# ——传送给shell程序的位置参数的数量
$0——shell程序的名称 即第一个参数
$*——调用shell程序时所传送的全部参数成的单字符串
shell中输⼊输出的标准⽂件
每个进程运⾏时⾃动打开三个⽂件,这些⽂件称为命令的标准⽂件,分别⽤于命令读取输⼊、输出结果以及输出错误消息,即
常用命令
export NAME=value //Name成为环境变量
标准变量也是环境变量,在bash环境建⽴时⽣成,该变量⾃动解析,通过查看etc⽬录下的profile⽂件可以查看系统中的标准环境变量;使⽤env命令可以查看系统中的环境变量,包括环境变量和标准变量。
实例:
env
set #看已经定义的变量
Shell中变量没有明确的类型,变量值都以字符串的形式存储。
算术运算需要使⽤命令将变量中的字符串转换为数值。Shell中的运算⼀般通过两个命令实现:let
和expr
。
let命令可以进⾏算术运算和数值表达式测试,let命令的使⽤格式如下:
i=1;let i=i+1; echo “i=$i”
i=1; echo “i=$((i+3))”
expr 数学表达式 //expr 3+5
脚本的控制结构语句有三种基本的类型:
测试语句是shell的特有功能,和各种条件语句来结合使用。
在shell中使用测试语句来计算判断条件的值。测试语句计算一个表达式的值并返回“真”或“假”。
格式:
test expression 例如: test –f "$1"
[ expression ] 例如: [ -f "$1" ]
测试类型:
[ "$s1" = "$s2" ]
test "$s1" = "$s2"
[ "$s1" -gt 10 ]
test "$s1" -gt 10
[ \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5 ]
test \( "$a" –gt 0 –a "$a" –lt 10 \) –a "$a" –ne 5
两路分支的if语句格式:
if 判断条件
then 命令1
else 命令2
fi
判断条件包括命令语句和测试语句两种方式:
命令语句形式的判断条件
作。如果在系统中就发一个问候给他。
#!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
测试语句形式的判断条件:
判断该文件在当前目录下是否存在且是一个普通文件。
#!bin/sh
if test -f "$1"
then echo "$1 is an ordinary file"
else echo "$1 is not an ordinary file"
fi
if 判断条件1
then 命令1
elif 判断条件2
then 命令2
……
else 命令n
fi
其中elif是else if的缩写
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
对同一变量进行多次的测试,比elif语句更简单、简洁
case string1 in
str1)
commands-list1;;
str2)
commands-list2;;
...
strn)
commands-listn;;
esac
含义:将stringl和strl…strn比较。如果strl和strn中的任何一个和string1相符合,则执行其后的命令一直到两个分号(;;)结束。如果没有符合的,则其后的语句不被执行。
使用case语句时应注意以下几点:
;;
)结束。case语句特点:
case $1 in
[dD]ate) echo "the date is `date`";;
dir|path) echo "current directory is `pwd`";;
*) echo "bad argument";;
esac
格式:
for variable [in argument-list]
do
command-list
done
其中的[in argument-list]
部分为可选项,由于它的不同又可有三种形式:
1、[argument-list]为变量值表
变量variable依次取值表中各字符串
for a in 1 2 3 4 5
do
echo "$a“
done
2、[argument-list]
为文件的表达式
变量的值依次取当前目录(或指定目录)下与文件表达式相匹配的文件名,每取值一次,就进入循环体执行命令表,直到所有匹配的文件名取完为止。
for i in *.c
do
ls $i
done
3、[argument-list]
为空
实际是用$*
来代替,变量依次取位置参数的值,然后执行循环体中的命令表,直至所有位置参数取完为止。
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
格式为:
while expression
do
command-list
done
作用:只要expression的值为真,则进入循环体,执行command- list
中的命令,然后再做条件测试,直到测试条件为假时才终止while语句的行。
while [ $1 ]
do
if [ -f $1 ]
then echo " display : $1 "
cat $1
else echo " $1 is not a file name . "
fi
shift
done
x=1
while [ $x -le 10 ]
do
echo $x
x=`expr $x + 1`
done
break命令可以从循环体中退出来。格式为:
break [n]
continue命令跳过循环体中在它之后的语句,回到本层循环的开头,进行下一次循环。格式为:
continue [n]
x=1
while true
do
echo $x
x=`expr $x + 1`
if [ "$x" -gt 10 ]
then break
fi
done
for i in 1 2 3 4 5
do
if [ " $i" –eq 3 ]
then continue
else echo " $i "
fi
done
五种基本的算术运算:+(加)、-(减)、\*(乘)、/(除)和%(取模)。shell只提供整数的运算。格式如下:
expr n1 运算符 n2
expr 15 \* 15
注意:在运算符的前后都留有空格,否则expr不对表达式进行计算,而直接输出它们。
退出脚本程序命令:
exit [n]
其中n为设定的退出值,如果未给定n的值,则退出值为最后一个命令的执行状态。
在shell脚本中可以定义并使用函数。其定义格式为:
function( )
{
command-list
}
函数应先定义,后使用。调用函数时,直接利用函数名调用。