shell脚本介绍
admin
2024-04-01 13:40:41
0
  • 本文章主要介绍下shell脚本相关的一些语法

1 变量

  • 在shell中,使用变量之前通常并不需要事先为它们做出声明,一般是使用时才创建。默认情况下,所有变量都被看作字符串来存储。通过在变量前加一个$符号来访问它的内容。
lng@ubuntu:~/myshell$ myData=hello
lng@ubuntu:~/myshell$ echo $myData
hello
lng@ubuntu:~/myshell$ 
  • 如果要赋值的字符串中有空格,就要用引号括起来,并且注意,等号两边不能有空格
lng@ubuntu:~/myshell$ myData="hello word"
lng@ubuntu:~/myshell$ echo $myData
hello word
lng@ubuntu:~/myshell$ 
  • 如果你把一个$变量表达式放在双引号中,程序执行到这一行时就会把变量替换为它的值,如果把它放到单引号中,就不会发生替换现象。
lng@ubuntu:~/myshell$ myData="welcome to xian"
lng@ubuntu:~/myshell$ 
lng@ubuntu:~/myshell$ echo "$myData"
welcome to xian
lng@ubuntu:~/myshell$ echo '$myData'
$myData
lng@ubuntu:~/myshell$ 

环境变量

  • 当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化。这些变量通过用大写字母作名字,以便把它们和用户在脚本程序里定义的变量区分开。
    • $HOME : 当前用户的家目录
    • $PATH : 以冒号分隔的用来搜索命令的目录列表
    • $0 : shell脚本的名字。相当于main函数的argv[0]
    • $# : 传递给脚本的参数个数。相当于main函数的 argc - 1
    • $$ : shell脚本的进程号
lng@ubuntu:~/myshell$ echo $HOME
/home/lng
lng@ubuntu:~/myshell$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
lng@ubuntu:~/myshell$ 
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/sh
echo $0
echo $#
echo $$
lng@ubuntu:~/myshell$ ./myTest.sh 
./myTest.sh
0
4053
lng@ubuntu:~/myshell$ ./myTest.sh aa bb cc
./myTest.sh
3
4054
lng@ubuntu:~/myshell$ 

参数变量

  • 如果脚本程序在调用时带有参数,一些额外的变量就会被创建。
    • $1, $2, … : 脚本程序的参数。相当于main函数的argv[1],argv[2],…
    • $@: 参数列表
    • $* : 参数列表
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/sh
echo $1
echo $2
echo $3
echo $@
echo $*
lng@ubuntu:~/myshell$ ./myTest.sh aaa 111 fff
aaa
111
fff
aaa 111 fff
aaa 111 fff
lng@ubuntu:~/myshell$ 

2 条件

test 或 [ 命令

  • test命令可以使用的条件类型可以归为三类:字符串比较,算数比较和文件有关的测试
  • 字符串比较
字符串比较结果
string1 = string2如果两个字符串相同则结果为真
string1 != string2如果两个字符串不同则结果为真
-n string如果字符串不为空则结果为真
-z string如果字符串为null则结果为真
  • 算术比较
算术比较结果
expression1 -eq expression2如果两个表达式相等则结果为真
expression1 -ne expression2如果两个表达式不等则结果为真
expression1 -gt expression2如果expression1大于expression2则结果为真
expression1 -ge expression2如果expression1大于等于expression2则结果为真
expression1 -lt expression2如果expression1小于等于expression2则结果为真
expression1 -le expression2如果expression1小于等于expression2则结果为真
! expression如果表达式为假则结果为真
  • 文件条件测试
文件条件测试结果
-d file如果文件是一个目录则结果为真
-f file如果文件是一个普通文件则结果为真
-r file如果文件可读则结果为真
-w file如果文件可写则结果为真
-x file如果文件可执行则结果为真
-s file如果文件大小不为0则结果为真
  • 测试案例
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shstr="hello"if [ $str = "hello" ];thenecho "str = hello"
filng@ubuntu:~/myshell$ ./myTest.sh 
str = hello
lng@ubuntu:~/myshell$ 
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shnum1=100
num2=200
if [ $num1 -eq $num2 ]
thenecho "num1 eq num2"
elseecho "num1 no eq num2"
filng@ubuntu:~/myshell$ ./myTest.sh 
num1 no eq num2
lng@ubuntu:~/myshell$ 
lng@ubuntu:~/myshell$ ls
a.txt  b.txt  dire  myTest.sh
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/sh
if test -f a.txt;thenecho "a.txt is file"
fiif [ -f b.txt ];thenecho "b.txt is file"
fiif [ -d dire ];thenecho "dire is directory"
fi
lng@ubuntu:~/myshell$ ./myTest.sh 
a.txt is file
b.txt is file
dire is directory
lng@ubuntu:~/myshell$ 

3 控制结构

3.1 if语句

  • if语句非常简单:它对某个命令的执行结果进行测试,然后根据测试结果有条件地执行一组语句。
  • 语法结构
if condition
thenstatements
elsestatements
fi
  • 测试用例
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shecho "please input yes or no!"#读取终端输入
read tempif [ $temp = "yes" ]
thenecho "you input is yes"
elseecho "you input is no"
filng@ubuntu:~/myshell$ ./myTest.sh 
please input yes or no!
yes
you input is yes
lng@ubuntu:~/myshell$ 

3.2 elif

  • 语法结构
if condition1
thenstatements
elif condition2
thenstatements	
elsestatements
fi
  • 测试案例
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shecho "please input yes or no!"#读取终端输入
read tempif [ $temp = "yes" ]
thenecho "you input is yes"
elif [ $temp = "no" ]
thenecho "you input is no"
elseecho "you input unknow"
filng@ubuntu:~/myshell$ ./myTest.sh 
please input yes or no!
fff
you input unknow
lng@ubuntu:~/myshell$ 

3.3 for语句

  • 我们可以用for结果来循环处理一组值,这组值可以是任意字符串的集合。
  • 语法结构
for variable in values
dostatements
done
  • 测试案例
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shfor fruit in apple bnana pear;
doecho "I like $fruit"
donelng@ubuntu:~/myshell$ ./myTest.sh 
I like apple
I like bnana
I like pear
lng@ubuntu:~/myshell$ 

3.4 while语句

  • for循环特别适合对于一系列字符串进行循环处理,但如果事先不知道循环次数,就可以用while
  • 语法结构
while condition; dostatements
done
  • 测试案例
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shecho "please input password!"read pwdwhile [ "$pwd" != "admin" ];doecho "Sorry, try again"read pwd
done 
exit 0
lng@ubuntu:~/myshell$ ./myTest.sh 
please input password!
123456
Sorry, try again
000
Sorry, try again
admin
lng@ubuntu:~/myshell$ 

4 函数

  • 如果需要编写大型的shell脚本程序,就要用到函数
  • 一个简单的函数
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shmyFunc(){echo "this is myFunc"
}echo "------"
myFunc
echo "++++++"
lng@ubuntu:~/myshell$ ./myTest.sh 
------
this is myFunc
++++++
lng@ubuntu:~/myshell$ 
  • 函数传入参数
lng@ubuntu:~/myshell$ cat myTest.sh 
#! /bin/shmyFunc(){echo "param num is $#"echo "param 1 is $1, param 2 is $2"echo "this is myFunc"
}echo "------"
myFunc aaa bbb
echo "++++++"
lng@ubuntu:~/myshell$ ./myTest.sh 
------
param num is 2
param 1 is aaa, param 2 is bbb
this is myFunc
++++++
lng@ubuntu:~/myshell$ 

5 命令

5.1 break

  • 跳出循环,跟C语言用法一样

5.2 continue

  • 跳出本次循环,跟C语言用法一样

5.3 echo

  • 打印命令

5.4 exit n

  • exit命令使脚本程序以推出码n结束运行
  • 在shell脚本编程中,推出码0表示成功,退出码1~125是脚本程序可以使用的错误代码。其余数字具有保留含义。
退出码说明
126文件不可执行
127命令未找到
128及以上出现一个信号

5.5 set

  • 为shell设置参数变量

5.6 uset

  • 从环境中删除变量或者函数
lng@ubuntu:~/myshell$ myData="hello"
lng@ubuntu:~/myshell$ echo $myData
hello
lng@ubuntu:~/myshell$ unset myData
lng@ubuntu:~/myshell$ echo $myDatalng@ubuntu:~/myshell$ 

5.7 find

  • find命令可用于文件的查找。介绍下常用的文件查找的命令

5.7.1 根据文件名查找

  • find 查找的目录 -name 文件名
lng@ubuntu:~/share/test$ ls
evp_aes.cpp  evp_aes.h  evp_aes.o  main.cpp  main.o  makefile  res
lng@ubuntu:~/share/test$ find ~ -name main.o
/home/lng/share/getopt/main.o
/home/lng/share/test/main.o
lng@ubuntu:~/share/test$ 

5.7.2 根据文件大小查找

  • find 查找的目录 -size 文件大小
lng@ubuntu:~/share/test$ ls -la
total 92
drwxr-xr-x  2 lng lng  4096 Aug 28  2021 .
drwxrwxr-x 15 lng lng  4096 Apr 30 05:18 ..
-rwxr--r--  1 lng lng  3760 Jul 31  2021 evp_aes.cpp
-rwxr--r--  1 lng lng  2115 Jul 31  2021 evp_aes.h
-rw-rw-r--  1 lng lng 22312 Aug 28  2021 evp_aes.o
-rwxr--r--  1 lng lng    57 Aug 28  2021 main.cpp
-rw-rw-r--  1 lng lng 11904 Aug 28  2021 main.o
-rwxr--r--  1 lng lng   203 Aug 28  2021 makefile
-rwxrwxr-x  1 lng lng 32488 Aug 28  2021 res
# 查找大于10k文件
lng@ubuntu:~/share/test$ find ./ -size +10k
./res
./main.o
./evp_aes.o
lng@ubuntu:~/share/test$ 

5.7.3 根据文件类型查找

  • find 查找的目录 -type f/d/b/c/s/p/l
lng@ubuntu:~/share/test$ ls
evp_aes.cpp  evp_aes.h  evp_aes.o  main.cpp  main.o  makefile  res
# 查找普通文件
lng@ubuntu:~/share/test$ find ./ -type f
./main.cpp
./evp_aes.h
./evp_aes.cpp
./res
./main.o
./makefile
./evp_aes.o
lng@ubuntu:~/share/test$ 

相关内容

热门资讯

贷款也“拼团” 银行抢单忙 购物能“拼团”,贷款也能! 近日,一场“拼团融资”的银企对接活动在省工业和信息化厅拉开帷幕。 “贷款...
逛花展、赶市集、嗨直播!202... 5月23日 “2026北京直播电商购物月” 在丰台区丽泽金融商务区·2026北京国际花展 正式拉开帷...
2026中关村毕业季|AI“吃... “上帝会掷骰子吗?” 在联想未来中心的“与智者同场”展区,一位海淀学子对着屏幕问道。 爱因斯坦微微前...
原创 今... 今日为5月23日,国际现货黄金价格在4500美元/盎司整数关口附近徘徊不前,日内最低触及4480美元...
三连亏后变为“无主”状态,农尚... 从吴亮手中接盘农尚环境(300536)不足三年后,林峰如今让出了公司控制权,上市公司进入“无主”状态...
55岁湖南女首富出手!豪掷13... 快科技5月24日消息,与马斯克、库克并肩而坐,刚参加完国宴的湖南女首富周群飞就买了家上市企业。 近日...
外资加仓A股,岂是跟风这么简单... 熬过忙碌的交易日,在周末安静时段,理清接下来布局方向。本篇为大家准备了5条要闻,涵盖市场动态、行业变...
原创 俄... 在全球能源的残酷牌桌上,手里攥着石油,腰杆子才能硬气。长期以来,中东的沙漠、俄罗斯的冰原、美国的页岩...
喜力啤酒有产品将涨价,华润啤酒... 来源:红星新闻 红星资本局5月22日消息,今日,红星资本局从雪花啤酒(厦门)有限公司、华润啤酒方面获...
原创 金... 心理预期调整刻不容缓,五月二十二日,黄金价格或将重现十五年前的历史性低迷。 近期若您密切关注着黄金市...
原创 马... 埃隆·马斯克如果能让SpaceX实现“科幻小说”级别的目标,他可能获得1万亿美元的收入。 埃隆·马斯...
涨涨涨!放开限制、可加杠杆!这... 韩国股市站在风口上! 据最新消息,为吸引更多海外资金进入股市,韩国政府计划放开限制,允许境外投资者直...
下周9家上会丨科创板首单IPO... IPO及再融资上会预告 据交易所官网审核动态信息,下周(5.25-5.29)IPO上会审核6家企业,...
富途、老虎市值蒸发1/4!或被... 来源:金融时报 5月22日,中国证监会宣布依法对Tiger Brokers (NZ) Limited...
马爸爸的好兄弟钱多多搞了杀猪盘... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 上周四,港股经纬天地大崩盘...
原创 壳... 编辑:XL 国际能源圈最近炸开了锅,壳牌这家百年石油巨头在2026年3月与委内瑞拉政府正式签署多项油...
存储热潮愈演愈烈!奖金拿到手软... 财联社5月24日讯(编辑 卞纯)在席卷全球的存储芯片热潮中,韩国“存储芯片双雄”SK海力士和三星无疑...
揽牌、合作、生态,跨境支付头部... 近日,国内头部跨境支付机构密集落地海外重要布局,一方面,连连数字、PingPong两家公司相继在中东...
原创 帮... 老铁们,周末好!我是帮主郑重。刚扫了一眼下周的财经日历,好家伙,事件一个接一个,堪称“消息面轰炸周”...
海南省住建厅与中国石化海南石油... 5月22日,中国石化海南石油分公司代表、党委书记李新强、总经理蔡文东一行赴海南省住建厅拜访交流。省住...