首页
论坛
课程
招聘
[原创]linux-shell编程[基础一把梭!]
2021-7-9 19:34 4748

[原创]linux-shell编程[基础一把梭!]

2021-7-9 19:34
4748

学习shell的时候,可以用vscode方便的运行修改shell,注意运行shell 的时候不需要F5
图片描述
点击终端即可.
图片描述
查看shell,修改shell

" class="anchor" href="# 图片描述"> 图片描述

开始必须有#!/bin/bash 做shell脚本标识
图片描述

重定向输出

命令详解:

> 将输出保存到xx文件,以覆盖方式保存.

图片描述

>>将输出保存到xx文件,以附加到文件末尾方式保存.

图片描述

文件描述符

0``:标准输入 /dev/stdin
1``:标准输出 /dev/stdout (正确无误,有输出的状态
2``:标准错误输出 /dev/stderr(命令执行出现错误的状态

结束一个不存在的进程

图片描述
&:表示把标准输出和错误输出都保存到同一文件
图片描述

管道

管道操作符 | 连接进程,使不同的进程可以进行数据传递.
ps -aux|grep firefox
管道符|将命令与命令连接起来,用第2个命令来接收第1个命令的输出.

shell

1
2
3
4
5
6
#!/bin/bash
# 第一行表示系统使用这个解释器执行
# 退出码可以用$?获取
# 脚本需要有执行权限  chmod 744 xxxx.sh
echo "hello world"
exit 0

图片描述

注释

1
2
3
4
5
6
7
# 1 注释
#  #表示单行注释
:<<!
我是多行注释
我是多行注释
我是多行注释
!

变量定义

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 02 变量定义,命名规则与C语言一样
name1="hello 15pb"
# local必须在函数中
local name2="hello world"
# 变量使用
echo $name1            #变量访问前加$
echo ${name2}
echo ${name1}     #变量访问前加${},数组必须使用这种方式<推荐

图片描述
!变量和=号不能有空格
不要跟系统已有的环境变量名重名
其他的和c语言,变量定义规则相同

字符串类型

字符串类型变量定义有3种:

1.单引号包含
2.双引号包含
3.无空格,啥都没有
图片描述

字符拼接

图片描述

字符长度/查找字符

1
2
3
4
5
6
7
#!/bin/bash
# 字符串操作
var_name="hello world"
# 字符长度
echo ${#var_name}            #在字符变量前加#
# 查找字符
echo `expr index "$var_name" w`

图片描述

字符截取

1
2
3
4
5
6
7
#!/bin/bash
var_name="hello world"
# 字符截取 string:起始位置:截取长度
echo ${var_name:6:4}
echo ${var_name:6}      #从第6个字符开始到末尾
# string:从末尾位置开始(从右向左,数7个,从第7个开始,从左到右取4个字符):截取长度
echo ${var_name:0-7:5}

图片描述

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 04 数组
# 定义 使用空格隔开
arr1=(1 2 3 4 5 6)
 
# 修改
arr1[0]=99
arr1[1]=188
# # 访问
echo ${arr1[0]}
echo ${arr1[1]}
# # 访问所有数据
echo ${arr1[*]}
echo ${arr1[@]}
# # 数组长度
echo ${#arr1[*]}
echo ${#arr1[@]}

图片描述

添加元素

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 04 数组
# 定义 使用空格隔开
arr1=(1 2 3 4 5 6)
# # 添加元素
arr1[${#arr1[@]}]=88
echo ${arr1[@]}                    #@号用于获取所有元素
arr1=(${arr1[@]} 99 111 222)
echo ${arr1[@]}

图片描述

参数变量 $n获取参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# 06  参数变量 $n获取参数
# $0 脚本名称
# echo ${0}
# $n 脚本参数
echo "参数0:${0}"
echo "参数1:${1}"
echo "参数2:${2}"
# 参数个素
echo "参数个数是:$#"
#脚本运行的当前进程ID号
echo "进程ID是$$"
#显示最后命令的退出状态  $?     0表示没有错误
echo "退出状态:$?"
# 所有参数组合的字符串
echo "$@"   #返回传递到程序中的所有参数
echo "$*"   #返回传递到程序中的所有参数

图片描述

环境变量

1
2
3
4
5
6
7
#!/bin/bash
# 07 环境变量
echo $HOME        #当前用户的家目录
echo $USER        #当前用户名称
echo $SHELL        #shell全路径名称
echo $RANDOM    #随机数
echo $PWD            #当前工作目录

图片描述

输入输出

1
2
3
4
5
6
7
8
#!/bin/bash
# 08输入输出
echo -n "输入用户名:"
read user_name
echo -n "输入年龄:"
read user_age
# 格式化字符串
printf "%s %d %s %d" $user_name 15 "pb" $user_age

图片描述

算数运算

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
# 09 算数运算
let a=9+7
echo $a
# 使用$(())  缺点在""中无法运算
a=$((9*7))
echo $a
# 使用$[]可以在字符串运行
echo "$[10*9]"
echo $[10*9]

图片描述

条件测试语句

1
2
3
4
5
6
7
8
9
#!/bin/bash
# 10 测试语句        测试已存在的文件1myshell.sh,不存在文件my99.sh
#   test  []  [[]]            #3种测试运算符
test -f 1myshell.sh            #-f 检测文件是否为普通文件
echo $?            #文件存在为0  不存在为1
[ -f 1myshell.sh ]
echo $?
[[ -f my99.sh ]]
echo $?

注意:在shell中,如条件为真,值为0.假为1.
图片描述

具体使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# 10 测试语句
if test -f main.c
then
    echo "文件存在"
else
    echo "文件不存在"
fi                                            #结尾标志,发现如if  case  的结尾都是反着来的 fi  esac 等
#使用or逻辑运算 -o ,1个位true返回true
if [ -f main.c1 -o -f error.txt ]
then
    echo "文件存在"
else
    echo "文件不存在"
fi
#使用and运算,2个都为true才返回true
if [ -f main.c1 -a -f error.txt ]
then
    echo "文件存在"
else
    echo "文件不存在"
fi

图片描述

关系运算

1
2
3
4
5
6
7
8
#!/bin/bash
# 必须使用单词代替符号
if [ 10 -gt 20 ] #-gt 等同>号
then
    echo "正确"
else
    echo "错误"
fi

图片描述

字符串运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# 必须使用单词代替符号
echo -n "输入一个用户名:"
read name
 
# 条件中需要空格隔开d
# if语句结尾必须使用fi
if test $name = "15pb"
then
    echo "输15pb"
elif test $name = "root"
then
    echo "输入root"
else
    echo "输入有错"
fi

图片描述

case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
echo -n "数字:"
read user_id
 
case $user_id in
1) echo "输入了1"            #匹配数字1  条件以 ) 做结束
;;                                        #必须用;;号,做结尾
2) echo "输入了2"
;;
3|4|5) echo "匹配多个"    #匹配 3  4  5 中任意1个
;;
"15pb") echo "输入了 15pb"        #匹配字符15pb
;;
*) echo "输入了其他"
;;
esac  #语句结尾

图片描述

循环语句>while

1
2
3
4
5
6
7
8
#!/bin/bash
#打印输出从0-99
count=0
while [ $count -lt 100 ] #-lt 等同 < 号
do
    echo "$count"           #打印
    let "count = count + 1"
done

for

1
2
3
4
5
6
#!/bin/bash
# for循环
for x in 1 2 3 4 5
do
    echo $x
done

图片描述

for步进循环

1
2
3
4
5
6
7
#!/bin/bash
# for循环
#打印输出从1-100
for x in {1..100}
do
    echo $x
done
1
2
3
4
5
6
7
8
#!/bin/bash
# shell中执行 新shell命令
# $(命令)
# `命令`
for dd in `ls -l`            #dd 自定义名
do
    echo $dd
done

它会把ls -l 显示的内容,将空格变为换行,打印显示
图片描述
执行脚本输出:
图片描述

c风格的for循环

1
2
3
4
5
#!/bin/bash
for((i=0;i<100;i++))        #打印0-99 需要(( ))
do
    echo $i
done

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
#  11 函数
 
#函数定义
function dosomething1()
{
    echo "我是返回值"
}
function dosomething2()
{
    return 100                    #使用return只能返回0-255的值,超过此值返回空
}
function dosomething3()
{
    echo "参数个数:$# "
    echo "第一个参数: $1 "
    echo "所有参数: $* "
}
 
# 调用函数
dosomething1                    #函数调用不加()
# 获取返回结果字符串
res1=$(dosomething1)
# 获取返回结果整数
dosomething2
res2=$?
echo "结果1:$res1; 结果2:$res2 "
res3=$(dosomething3 aa  bb)
res3=$(dosomething3)  aa  bb #错误的使用
echo "res3:$res3"
dosomething3  cc xx         #传参方式,函数后紧接着就是参数,不用()

" class="anchor" href="# 图片描述"> 图片描述

makefile 文件名(相关,初学者略过即可)

 

% 号 代表任意字符
命令前加@ 表示无回显
$@ 表示目标文件
$^所有的依赖文件
ifeq 不能有tab

 

call 调用自定义参数 传参
-wall 表示忽略警告

 

vscode 快捷键操作

ctrl + / 取消注释

最后想请教一下大佬
vscode project generator这个插件,怎么用呀?

看了一些帖子没看懂,找到一个小视频也没看懂.求教呀

最后:感谢15pb教授本课的黄老师
感谢看雪论坛这个大家庭呀!


第五届安全开发者峰会(SDC 2021)10月23日上海召开!

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回