c语言sscanf函数的用法是什么
236
2022-11-30
linux入门学习笔记#05
linux入门学习笔记#01
linux入门学习笔记#02
linux入门学习笔记#03
linux入门学习笔记#04
本文主要讲 linux 中 shell 的编程
目录
一些说明
在脚本中传递参数
read 命令
返回码 Return Code
使用 test 比较整数的大小
使用test比较字符串
使用test比较文件
判断分支:if 和 case
使用 let 在 shell 中赋值
shell 中的循环:for while 和 until
shell 中的函数
一些说明
关于 shell 的说明
一般 shell 只能处理整数,使用 awk 和 bc 来计算浮点数
关于 shell 中的变量,之前的文章已经讲过
脚本一般用 .sh 结尾,虽然说 linux 中不要求什么后缀名格式,但是这个后缀是说明这是个脚本,是为了方便人看的
在脚本的前面有时候会有 #! /bin/sh ,这个是指定运行 shell 的解释器,可写可不写
用 -x 在命令运行前打印,这样可以知道现在进行到哪一行,出错了方便调试
$ /bin/sh –x trim.sh
在脚本中传递参数
1、逐个传递参数
脚本中 $0 代表脚本的名称
$1 和 $2 ...代表
语法如下 $ script.sh argument1 argument2 argument3 .... argumentx 对应 $0 $1 $2 $3 $4....
看一段例子
$ cat color3.shecho the name of the script : $0echo the first argument is : $1echo the second argument is : $2$ chmod u+x color3.sh$ color3.sh tt yythe name of the script : color3.shthe first argument is : ttthe second argument is : yy
2、整体传递一串参数
$* 代表所有的参数
$# 代表参数的个数
使用 shift 可以将这串参数向左移动
$ cat ./test.shecho we got $*shift 2 # 所有参数整体左移两个echo shift 2 and we got $* shift 2echo shift 2 again we got $* shift 2echo finally $*$ ./test.sh 1 2 3 4we got 1 2 3 4shift 2 and we got 3 4shift 2 again we got finally # 依然为空# 这里说明没有参数了继续 shift 的话就是空
3、$$代表当前进程号
(base) 123deiMac:~ a123$ echo $$2649(base) 123deiMac:~ a123$ ps PID TTY TIME CMD 2649 ttys000 0:00.02 -bash
read 命令
用于在脚本运行期间在键盘上输入命令
但实际上 read 最多的用法是让程序暂停一下(因为我们希望程序是自动运行,在运行期间无需再输入参数)
返回码 Return Code
$? 代表程序运行的返回码
使用 exit 0 指定返回码为 0
在程序的循环/选择/判断分支中指定返回码,可以判断程序的执行情况
要注意 shell 中返回 0 一般代表正常
返回 1 代表错误
使用 test 比较整数的大小
语法
[ number option number ] # 注意这里的方括号内一共有四个空格,要打全四个空格不然 shell 不认
或者
test number option number
shell 一般只能处理整数,要用浮点数的话考虑 awk 和 bc
Option :
-lt less than
-le less than or equal to
-gt greater than
-ge greater than and equal to
-eq equal to
-ne not equal to
(base) 123deiMac:~ a123$ tmp=3(base) 123deiMac:~ a123$ [ "$tmp" -lt 5 ](base) 123deiMac:~ a123$ echo $?0(base) 123deiMac:~ a123$ ["$tmp" -lt 5] # 没打全四个空格-bash: [3: command not found(base) 123deiMac:~ a123$ test $tmp -lt 5(base) 123deiMac:~ a123$ echo $?0
使用test比较字符串
注意这里比较是否相同时一个等号(而非 C++ 中的两个等号)
[ “string1” = “string2” ] # string1 与 string2 相等则返回真
[ “string1” != “string2” ] # string1 与 string2 不相等则返回真
[ -z “string” ] # string 的长度为零则返回真
[ -n “string” ] # string 的长度不为零则返回真
[ “string” ] # 同上一条
看一个例子,感受用 test 进行数字比较和字符串比较的异同
$tt =03$ bb = 3$ [ “$tt” –eq “$bb” ] # do numerical comparison $ echo $? # true0$ [ “$tt” = “$bb” ] # do string comparison$ echo $? # false1
使用test比较文件
语法:
$ test -option filename
或
$ [-option filename ] # 注意是三个空格
Options:
-d FILE # FILE exists and is a directory
-e FILE # FILE exists
-f FILE # FILE exists and is a regular file
除此之外,可以用 -nt 和 -ot 比较两个文件的新旧
$ [ FILE1 -nt FILE2 ] # true, if FILE1 is newer (modification date) than FILE2
$ [ FILE1 -ot FILE2 ] # true, if FILE1 is older than FILE2
判断分支:if 和 case
if 用于二分支,case 用于多分支
没有大括弧,一般使用缩进方便阅读(没有缩进机器也认识,但是人不容易看)
把指定字反过来写以结束此分支
$ more color14.sh#!/bin/shecho “pls input a value : \n” read xxif [ “$xx” –gt 10 ]then echo xx echo is larger than 10else echo xx is less than 10fi
下面这个例子说明 case 的匹配中
* 表示任意字符(包括空字符)
? 表示单个字符
[...] 匹配方括号中的任意字符
| 表示或
$ more color15.sh#!/bin/shecho “pls input a value : \n” read xxcase $opt in 1) echo option 1 ;; 2) echo option 2 ;; 3) echo option 3 ;; *) echo option not in 1-3 ;;esac
使用 let 在 shell 中赋值
$ x=1.1$ y=8$ z=2.2$ let aa=x+y-bash: let: 1.1: syntax error in expression (error token is ".1")$ let bb=y/x-bash: let: 1.1: syntax error in expression (error token is ".1")# system gives error message$ let cc=y/3$ echo $cc 2 # 说明结果是浮点数时只会取整数部分,不会四舍五入
let 除了赋值还能比较数的大小(和 test 的操作符不一样,test 要四个空格,使用 -lt 等,let 使用大于小于号)
$ x =2$ (( x=x+2 ))$ echo $x4$ (( x < 1 ))$ echo $?1 # false
shell 中的循环:for while 和 until
这三个中用的最多的还是 for
while 和 until 就是相互为否定的关系
until 和 while 加了否定就可以互换
所以这里重点讲 for
1、在一个列表中循环
$ more color23.sh#!/bin/shfor xx in 1 2 3 4 5 do let xx=xx*xx echo xx is $xxdone$ chmod u+x color23.sh$ color23.shxx is 1xx is 4xx is 9xx is 16xx is 25
2、字符串的循环 考虑使用 cat
$ more color24.sh#!/bin/shls > dir_list # save the directory list in file dir_listfor xx in $(cat dir_list) # list in the format of $(command) # for xx in dir_listdo if test -d $xx # if $xx is a directory then echo the content of dir $xx ls -F $xx # list the content of directory $xx echo fidone
3、其他一般的循环,语法类似 C++
for((i=1;i<=10;i++));do echo $(expr $i \* 4);donefor((i=1;i<=10;i++))do echo $(expr $i \* 4) # do echo `expr $i \* 4`done
4、for 中的 break continue 和 exit
类似于 C++
break 退出本次循环
continue 跳过本次循环
exit 退出这个程序
shell 中的函数
工作中会用到,这里不展开讲
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~