0
点赞
收藏
分享

微信扫一扫

shell编程学习笔记


shell脚本就是将完成一个任务的所有 的命令按照执行的先后顺序,自上而下写入到一个文本文件中,然后给予执行权限。

vim hello.sh

# hello.sh
#!/bin/bash
echo "Hello World!"

chmod 700 hello.sh

./hello.sh
Hello World!

语法规范

基本规范

  • 命名:命名要有意义(30个字解决)、以.sh结尾
  • 脚本格式:开头指针脚本运行环境,以#!组成(如#!/bin/bash)—解释环境
  • 注释:#,最好加入说明字段:Author,Created Time,Script Description—注释说明

给予权限的时候如果在解释环境下可以不给权限

bash hello.sh

特殊符号

  • ~:家目录
  • !:执行历史命令
  • $:变量中取内容符
  • &:后台执行
  • ;:一行执行多个命令,以此为间隔
  • |:管道符
  • ``:反引号,命令中执行命令

管道

上一个命令的输出作为下一个命令的输入

shell重定向

>  # 重定向输入,覆盖
>> # 重定向输入,追加
< # 重定向输出
<< # 重定向输出,追加输出

<可用来作为命令的option项

<<重定向输出就是当执行文件的时候,有些参数 要我们输入,此时可用(交互)

# 例如磁盘分区
fdisk /dev/sdb << EOF
n
p
3

+534M
w # 保存退出
EOF

格式化输出

echo
参数

  • n:不要自动换行
  • e:若出现某个字符。特殊处理
  • \a:发出警告声
  • \c:不换行
  • \n:换行且光标移动到行首
  • \t:插入tab
  • -help:显示版本信息

程序交互

read命令:默认接受键盘的输入,回车符代表输入结束

  • p:打印信息
  • t:打印时间(超时限制)
  • s:不回显
  • n:输入字符个数

变量

变量分类:

  • 本地变量:用户私有变量,只有本用户可以用,保存在家目录下的.bash_profile,.bashrc文件中
  • 全局变量,所有用户都可以使用,保存在etc下的.bash_profile,.bashrc文件中
  • 用户自定义变量,脚本中的变量

变量定义:变量名=值

  • 命名只能用英文字母,数字或下划线,首个字符不能以数字开头
  • 命名不能有空格,可以使用下划线
  • 不能使用标点符号
  • 不能使用bash里面的关键字

读取变量

echo $name

取消变量

unset name

定义全局变量export

export name="abc"

上面的这些都是临时变量,想要定义永久变量写在配置文件中.bash_prefile,.bashrc

数组

基本数组

# 数组名称=(元素1 元素2...)

数组读出

echo ${(array_name)[index]}

访问数组元素

echo ${(array_name)[@]}   # 访问数组所有元素
echo ${#(array_name)[@]} # 统计数组个数
echo ${!(array_name)[@]} # 获取数组元素的索引
echo ${(array_name)[@]:1:2} # 从数组下标1开始,访问两个元素

关联数组

类似于字典,首先得串联数组变量

declare -A array_name

array={[name]='b' [age]='a'}

流程控制语句

运算

数学比较运算

  • eq:等于(equal)
  • gt:大于(greater)
  • lt:小于(less)
  • ge:大于或等于(greater or equal)
  • le:小于或等于(less or equal)
  • ne:不等于(not equal)

文件运算

  • d:检查文件是否存在且为目录
  • e:检查文件是否存在
  • f:检查文件是否存在且为文件
  • r:文件是否可读
  • s:不为空
  • w:是否可写
  • x:可执行
  • O:是否被当前用户拥有
  • G:默认用户组为当前用户组

字符串比较运算

  • ==:等于
  • !=:不等于
  • -n:字符串长度是否大于0
  • z:字符串长度是否为0

逻辑运算

  • &&
  • ||

赋值运算

  • =

if语法

单分支语句

if [condition]
then
commands
fi # 结束

双分支语句

if [condition]
then
commands
else
commands
fi # 结束

多分支语句

if [condition]
then
commands
elif [condition]
then
commands
else
commands
fi # 结束

给脚本传参

# shell.sh
$1 $1
# shell
bash shell.sh 1 2
bash shell.sh 3 4

条件符号使用双圆括号,可以直接在条件中植入数学表达式

if ((2%1== 1)); then
commands

使用双方括号,可以在条件中使用通配符

控制语句

for

条件循环

for var in val1 val2
do
commands
done

C语言写法

for ((i=1;i<10;i++))
do
echo i
sleep 1 # 睡眠时间
done

如果是字符串记得转义

#!/bin/bash
for var in I love you
do
echo " word: $var "
sleep 1
done

#!/bin/bash
for ((i=1;i<10;i++))
do
echo $i
done

循环控制语句

sleep:循环节奏

continue:跳出本次循环

break:跳出循环

while

条件为真执行,条件为假跳出

while [condition]
do
done

until

条件为假执行,条件为真跳出

#!/bin/bash
read -p "num: " num

until [ $num -eq 5 ]
do
echo "Hello World!"
done
echo "pp"

case多条件分支语句

#!/bin/bash
read -p "num: " num
case $num in
1)
echo $num
;;
2)
echo $num
;;
esac

#!/bin/bash
case $1 in
zmn|ZMN)
echo "yes"
;;
lrn|LRN)
echo "no"
;;
esac

shell特殊变量

  • $*:代表所有参数
  • $#:代表参数数量

函数

语法

第一种

#函数名() {
# 函数体
# return N
#}

第二种

#function 函数名 {
# 函数体
# return N
#}

例如

#!/bin/bash
start() {
echo "Hello World!"
}

stop() {
echo "ByeBye!"
}
start
stop

正则表达式

定位符

  • ^:以什么开头
  • $;以什么结尾

^a
c$

匹配符

  • .:匹配除了回车以外的任意字符
  • ():字符串分组
  • []:匹配括号中的一个字符
  • [^]:否定括号内的字符
  • \:转义字符

限定符

  • *:不出现或出现多次
  • ?:出现一次或不出现
  • +:出现一次或多次,但必须出现一次
  • {n,m}:出现最少n次,最多m次
  • {n}:正好出现了n次


举报

相关推荐

0 条评论