Linux 环境开发基础
文章目录
本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以点击链接,详细查看详细的服务: 链接
环境编程
需要组件
1.安装vmware
2.安装Linux desktop/server
3.安装配置samba
4.安装编辑器 vscode/sourcelnsight
5.ssh操作终端软件 xshell/putty
6.gcc/g++
安装samba
用于主机和虚拟机进行文件传递
sudo apt-get install samba
在Ubuntu上修改配置samba,添加文件夹配置信息
sudo gedit /etc/samba/smb.conf #格式如下
[share]
comment = my samba
path = /home/pwn/c_code # 共享路径
browseable = yes
writable = yes
添加指定用户至smb用户组(具体用户名pwn 请自行修改)
sudo smbpasswd -a pwn
使用上述命令链接即可
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7cAc0BFB-1687972474077)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16878522465777.jpg)]
linux 环境编程
#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 shell
样例如下:
#!/bin/bash
echo “Hello World!” # 命令 用于向窗口输出文本。
变量
注意事项:
1> 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
2> 中间不能有空格, 可以使用下划线 。
3> 不能使用标点符号。
4> 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)
定义变量
1.定义变量时,变量名不加美元符号($),如:
和其他编程语言类似 ,但是变量等号之间不能有空格
a="baidu.com"
使用变量
直接前面加 $ 符号即可饮用
b="baidu.com"
echo $b
echo ${b} // 效果一样
使用教程 :
do:do 是 for、while 和 until 循环中的关键字,用于标记循环的开始。它指示循环应该执行的一系列操作或语句。
done:done 是 for、while 和 until 循环中的关键字,用于标记循环的结束。它表示循环块的范围结束,所有的循环语句都在此之前。
#!/bin/bash
for file in $(ls /home/); do # 创建for 循环 do标记开始
echo "${file}" #中间语句
done # 标记结束
只读变量 && 删除变量
#只读变量
#!/bin/bash
a="passwd"
readonly a # 设置只读模式,会直接报错
a="ss"
#删除变量
#!/bin/bash
a="passwd"
unset a # 删除变量
echo $a
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LFgDrJd1-1687972474078)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16878521157644.jpg)]
字符串
注意:(){} 区别
() 可以创建一个子shell,子shell中的命令将在子进程中执行
{} 可以将多个命令组合成一个块,并作为一个单独的命令执行。常见用法是在循环中使用 {} 来定义命令块
单引号
单引号字符串的限制:
str='this is a string'
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号
your_name='0voice'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
输出结果为:
双引号的优点:
1.双引号里可以有变量
2.双引号里可以出现转义字符
拼接
a="ceshi"
ces="${a} sss"
sd="ssd2 "$a" "
echo $ces
echo $sd
echo $a $ces
注意:写代码一定不要留空格会报错
字符串特殊操作
# 读取长度
dd="sdsdasd"
echo "${#dd}" #
# 提取字符串
dd="1234565"
echo "${dd:1:3}"
# 查询字符串
ds="sodasjcwois ov bur"
bs=`expr index "$ds" bu` # 输出位置
echo $bs
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEgd32CG-1687972474079)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16878737909085.jpg)]
数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0 。
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
也可以单独定义
array[0]=1
array[1]=2
array[2]=3
可以不使用连续的下标,而且下标的范围没有限制。
${数组名[下标]} #读取数组格式:
echo ${array_name[@]} #符号可以获取数组中的所有元素
array[0]=1
array[1]=2
array[2]=3
array[3]=0
echo ${array[1]}
echo ${array[@]}
echo ${#array[@]}
运行记录
注解
单行
#
多行
:<<EOF
XXXX
EOF
多行2
:<<'
'
多行3
:<<!
!
参数传递 && 特殊字符
脚本时,向脚本传递参数,脚本内获取参数的格式为:
$n 。 n 代表一个数字,
1 为执行脚本的第一个参数,
2 为执行脚本的第二个参数,以此类推
$0 为传输文件名
案例如下:
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WyecThWS-1687972474080)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16878745402192.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SgYdW1wY-1687972474080)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16878746819901.jpg)]
$* 与 $@ 区别:
* 相当于传入了一个参数
@ 相当于传入了多个参数
算数运算符
算数运算和其他编程语句类似 + - / % 是一样的,不同的是需要用 尖括号 + expr 这个单词 去进行计算
案例如下:
val `expr $a + $b`
echo "a + b $val
关系运算符
支持数字和数字类型字符串
主要用来比大小,和确定返回值
比如: [$? -eq 0] # 接收返回值,判断是否成功
运算符 说明 举例
-eq
检测两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
布尔运算&& 文件测试符
a 为 10 ,变量 b 为 20
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dKLOtgX2-1687972474082)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16879316830307.jpg)]
文件测试运算符意思是,判断文件的相关操作,比如是否为空啊 这种
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4QcHq39-1687972474083)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16879318131416.jpg)]
S : 判断某文件是否 socket 。
L : 检测文件是否存在并且是一个符号链接。
。
变量 file 表示文件 home /king/test.sh
字符串运算符
test
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPhQridE-1687972474084)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16879321402642.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3RYxiFw8-1687972474085)(https://tuc-1259775406.cos.ap-nanjing.myqcloud.com/2023/06/29/16879322568206.jpg)]
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
SHELL流层面
if / else
if xxx
then
1
2
3
fi
也可以写成一行
if xxx;then xx;fi
if XXX
then
1
2
3
elif xx
1
2
else
1
fi
for 循环
for var in test1 test2
do
com1
com2
done
案例
#优化检验内网IP是否在使用
#!/bin/bash
ip="192.168.124"
for i in {1..50};do
ping -c 3 -i 0.1 -W 5 $ip.$i &>/dev/null
if [ $? -eq 0 ]; then
echo "${ip}.$i up"
else
echo "${ip}.$i down"
fi
done
案例2
a=$1
ifconfig | grep -A 3 "$a" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" | head -n 1