一文帮你搞定shell编程!
六、脚本与用户交互 操作命令行参数
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
最新活动更多
-
精彩回顾立即查看>> 【工程师系列】汽车电子技术在线大会
-
精彩回顾立即查看>> 【北京站】2025 STM32研讨会
-
精彩回顾立即查看>> 【在线会议】英飞凌OBC解决方案——解锁未来的钥匙
-
精彩回顾立即查看>> 【工程师系列】汽车电子技术在线大会
-
精彩回顾立即查看>> 【在线研讨会】普源精电--激光原理应用与测试解决方案
-
精彩回顾立即查看>> 【在线会议】汽车腐蚀及防护的多物理场仿真
推荐专题
- 1 微星首款全白M-ATX小板! MPG B850M EDGE TIMAX WIF刀锋 钛评测:媲美顶级X870E
- 2 AI录音笔的终极答案,竟是一个“待办”按钮
- 3 板块一年暴涨80%!AI 吞噬式需求引爆存储超级周期
- 4 4卡96GB显存暴力输出!锐炫Pro B60和长城世恒X-AIGC工作站评测:可满足千人同时在线聊天
- 5 送房出圈、研发破局,年会成影石向大疆反攻“誓师大会”?
- 6 1000 倍效率神话,Taalas如何用 “模型即芯片” 暴打英伟达
- 7 龙芯3B6000 Linux系统性能评测:光线追踪测试差点追平AMD锐龙5 9600X!
- 8 AI加持下的精英商务本 联想ThinkPad T14 Gen6笔记本评测:28W锐龙能效喜人 内建NPU更灵活
- 9 OpenClaw“小龙虾”,谁是盈利最强企业?
- 10 4599元起!苹果MacBook Neo来了:搭载A18 Pro芯片,刀法依然精准


分享














发表评论
登录
手机
验证码
手机/邮箱/用户名
密码
立即登录即可访问所有OFweek服务
还不是会员?免费注册
忘记密码其他方式
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论