订阅
纠错
加入自媒体

Linux入门:一文帮你搞定shell编程!

2021-05-28 14:51
一口Linux
关注

六、脚本与用户交互 操作命令行参数

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


<上一页  1  2  3  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    人工智能 猎头职位 更多
    扫码关注公众号
    OFweek人工智能网
    获取更多精彩内容
    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号