六、脚本与用户交互 操作命令行参数
1. 读取参数
bash shell用位置参数变量(positional parameter)存储命令行输入的所有参数,包括程序名。其中,表示程序名,1表示第1个参数,表示第个参数,,9表示第9个参数。如果参数个数多于9个,必须如下表示变量:,{11},...
#!/bin/bash
# author:一口Linux
for((count = 1; count <= $1; count++))
do
echo The number is $count.
done
执行结果:
修改脚本如下:
echo $1, $2, $3, $4
执行结果如下:
2 读取程序名
首先想到的是利用,但是0获取的文件名包括./以及路径等前缀信息,如下:
echo The command entered is: $0
# 运行:./
# 输出:The command entered is: ./14.sh
如果想仅得到文件名,而不包含./,可以使用basename命令:
name=`basename $0`
echo The command entered is: $name
# 运行:./
# 输出:The command entered is: 14.sh
3 特殊变量$#表示命令行参数的个数:
#!/bin/bash
# author:一口Linux
params=$#
echo The number of params is: $params
for((i = 1; i <= params; i++))
do
echo The param is: $i
done
执行结果
如果想获取所有的参数,当然可以利用#和循环逐个遍历。也可以利用如下两个特殊变量:*将所有的命令行参数看作一个整体存储,而$@将命令行中以空格间隔的参数单独存储,如下:
#!/bin/bash
# author:一口Linux
count=1
for param in "$*"
do
echo "$* parameter $count = $param"
count=$[ $count + 1 ]
done
count=1
for param in "$@"
do
echo "$@ parameter $count = $param"
count=$[ $count + 1 ]
done
4 基本的读取
read命令接受从键盘或文件描述符中的输入数据,将其存储到一个指定变量中。
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
-n:设置允许输入字符的个数
参数
变量:指定读取值的变量名
操作详解
例1#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Please enter your name: " name
echo "Hello $name."
执行结果
例2read命令中,可以根据需要将输入的数据保存在多个变量中,如果指定的变量比较少,那么最后一个变量将包含余下的所有输入,如下所示:#!/bin/bash
# author:一口Linux
# testing the read option
read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
执行结果:
综合例子提示用户输入一个正整数num,然后计算1+2+3+...+num的值;必须对num是否为正整数做判断,不符合应当运行再次输入
思路:
expr只能对整数进行计算,直接用expr 和一个整数计算获取 $? 的值来判断是否为整数在使用 expr $num1 > 0 判断是否大于0#!/bin/bash
# author:一口Linux
while true
do
read -p "please input a positive number: " num
# 判断数是否是整数
expr $num + 1 &> /dev/null
if [ $? -eq 0 ];then
# 判断这个整数是否大于0,大于0返回1
if [ `expr $num > 0` -eq 1 ];then
#echo "yes,positive number"
# $sum没有赋值,默认为0
for i in `seq 0 $num`
do
sum=`expr $sum + $i`
done
echo "1+2+3+...+$num = $sum"
# 执行计算需要退出
exit
fi
fi
echo "error,input enlegal"
continue
done
测试:
七、关系运算符
有时候我们需要比较两个数字的大小关系,这时候就要用到关系运算符。关系运算符只支持数值运算,不支持字符运算。
1. 知识点详解
Shell 语言支持下面这些关系运算符:
-eq:检测两个数是否相等,相等返回 true。
-ne:检测两个数是否不相等,相等返回 true。
-gt:检测左边的数是否大于右边的,如果是返回 true。
-lt:检测左边的数是否小于右边的,如果是返回 true。
-ge:检测左边的数是否大于等于右边的,如果是返回 true。
-le:检测左边的数是否小于等于右边的,如果是返回 true。
2. 操作详解#!/bin/bash
# author:一口Linux
a=10
b=20
if [ $a -gt $b ]
then
echo "a great than b"
else
echo "a not great than b"
fi
执行结果!如下:
八、字符串运算符
1. 知识点详解= 比较两个字符串是否相等
!= 比较两个字符串是否不相等
-z 检测字符串的长度是否为零
-n 检测字符串的长度是否不为零
$字符名 变量是否有负值(为空),有返回True,没有返回False
2. 操作详解#!/bin/bash
# author:一口Linux
###本脚本主要用于字符串运算符
if [ ! $1 ]
then
echo "第一个参数为空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************执行用例的格式为:sh $0 变量1 变量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
if [ ! $2 ]
then
echo "第二个参数为空"
echo "****************************************************************"
echo "****************************************************************"
echo "**************执行用例的格式为:sh $0 变量1 变量2***************"
echo "****************************************************************"
echo "****************************************************************"
break
else
###1、检测两个字符串是否相等;
if [ $1 = $2 ]
then
echo "这是第一个判断语句"
echo "变量1等于变量2"
else
echo "这是第一个判断语句"
echo "变量1不等于变量2"
fi
###2、检测两个字符串是否不相等;
if [ $1 != $2 ]
then
echo "这是第二个判断语句"
echo "变量1不等于变量2"
else
echo "这是第二个判断语句"
echo "便量1等于变量2"
fi
###3、检测字符串长度是否为0
if [ -z $1 ]
then
echo "这是第三个判断段语句"
echo "变量1字符串长度为0"
else
echo "这是第三个判断段语句"
echo $1
fi
###4、检测字符串长度是否不为0
if [ -n $2 ]
then
echo "这是第四个判断语句"
echo "变量2字符串长度不为0"
echo $2
else
echo "这是第四个判断语句"
echo "变量2字符串长度为0"
fi
###5、检测字符串是否不为空
if [ $1 ]
then
echo "这是第五个判断语句"
echo "变量1不为空"
else
echo "这是第五个判断语句"
echo "变量1为空"
fi
fi
fi
测试结果:
九、shell文件及目录常用操作的几个实例
提取路径的目录和文件名提取目录:dirname $path
提取文件名:
basename $path
批量重命名带有空格文件function processFilePathWithSpace(){
find $1 -name "* *" | while read line
do
newFile=`echo $line | sed 's/[ ][ ]_/g'`
mv "$line" $newFile
logInfo "mv $line $newFile $?"
done
}
遍历文件内容cat /tmp/text.txt | while read line
do
echo $line
done
文件不存在,则创建文件[ -f $logFile ] || touch $logFile
递归遍历目录function getFile(){
for file in `ls $1`
do
element=$1"/"$file
if [ -d $element ]
then
getFile $element
else
echo $element
fi
done
}
清空文件内容cat /dev/null > $filePath