-
-
[原创]linux-shell编程[基础一把梭!]
-
2021-7-9 19:34 10163
-
学习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教授本课的黄老师
感谢看雪论坛这个大家庭呀!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
看原图