OpenWrt是基于Linux系统进行开发需要学习Linux系统基本知识。下面介绍一下OpenWrt系统下常用的指令。
时间命令
查看当前时间
date
查看当前日历
cal
关机和重启
立即安全关闭系统
shutdown -h now
嵌入式设备不会关机,只会停止运行系统。
重新启动系统
reboot
强制将缓存写入存储器
sync
这个指令是用来保证在重启之后不会因缓存没有保存到磁盘上而导致文件损坏。这个指令没有任何返回信息。
权限机制
执行ls -l指令可以获取当前文件夹中的一般文件
文件权限
比如
第一个字符表示是否是文件夹,如果显示为d表示目录,显示-表示非目录
接下来3个字符为一组,第一组表示文件所有者对该文件的权限,第二组表示相同用户组对该文件的权限,第三组表示其他人对文件的权限。-表示不存在权限,权限r(可读)、w(可写)、x(可执行)。
所有者
文件权限之后,li表示这个文件的所有者用户
第二个li表示这个文件所有者的用户分组
文件容量
数字82表示该文件的容量,单位是字节。如果要换算成KB,要用该数值除以1024,换算程MB,要用该数值初一1024两次。
文件日期
7月8 14.46为文件修改日期
可执行文件
Linux中看是否可执行看以下参数:
文件是否被给予了执行权限;是二进制可执行文件,还是脚本程序。
隐含文件
可以使用ls-al查看隐含文件,这些文件都是数据文件,是为了让文件列表看起来更清爽。
修改所有人
只有root用户才能将文件所有人修改为其他人
chown li demo2.sh
修改目录和目录下所有文件
chown -R li ./*
修改所有组
chgrp li demo2.sh
修改目录和目录下所有文件
chgrp -R li ./*
修改文件权限
关键字chmod 权限编号 文件(目录)
权限编号:r:4 w:2 x:1
权限编号一个3位,表示所有者,所有组,其他人权限。
比如权限编号760表示所有者拥有rwx权限,所有组拥有读写权限,其他人无权限。
修改目录和目录下所有文件(sh结尾的)
chmod -R 600 ./*.sh
文件与目录管理
路径概念
根目录:/表示根目录,所有的资源都是在根目录之上存在的。
相对路径:从根目录开始写的叫绝对路径
相对路径:从当前目录开始找的叫当前路径
特殊目录
一个是.和..这两个是特殊目录
.代表当前目录,..代表上一级目录。
变换目录
cd
查看当前所在目录是哪个
pwd
创建目录
mkdir
删除目录
rmdir
删除目录指令只能删除空的目录,如果目录下面还有其他文件和目录,就要使用rm命令了。
列表文件和目录
ls
显示文件详细信息 -l;显示包括隐含文件-al;显示其他路径下的文件详细信息。-l [路径]
复制文件或者目录
cp [参数] 原始位置 目标位置
[参数]:-a:保留原有权限
-af:保留原有权限,复制原始位置下的所有文件及目录
-avf: 保留原有权限,复制原始位置下的所有文件及目录,并且在屏幕显示过程
删除文件或整个目录
rm [参数] 路径或文件名
[参数]:-f:强制删除,不提示确认
-r:递归删除
移动或更名
mv [参数] 原始名字或路径 新名字或路径
[参数]:-f:强制完成
文件分析
查看各种文件内容
cat [文件名]
仅限于查看文本文件
分行查看
cat [文件名] |more
按回车就会一行一行的弹出来,提前结束查看可以使用 Ctrl+C
查看文件最后几行
tail [参数] 文件
[参数]:-n 行数,-n 50就是50行
查看启动信息
dmesg
可以搭配|more分行查看
其他指令
查看进程:ps
查看内存:free
查看内核版本:uname -r
查看工作时间:uptime
查看网络端口:netstat -lnp
查看磁盘使用情况:df
查看已经装载的分区:mount
查看系统可用磁盘和分区:fdisk -l
Vi编辑器
vi命令
Vi [文件名]
如果文件名存在则编辑该文件,如不存在则创建一个新文件。
出现”新文件“则表示这个文件不存在。
Vi的3个状态
命令行模式:打开文件的默认状态。命令行模式可以进入另外两种模式;在命令行模式可以删除某一行内容,将光标移动到该行上快速敲击d两次。
插入模式:可以修改内容。命令模式输入i进入插入模式;插入模式下,按ESC返回命令行模式
底行模式:实现文件保存和退出。命令行模式中输入”:W“ 保存文件;”:wq“ 保存并退出;”:q!“ 退出但是对修改不做保存。
如果在编辑过程中,掉电,断网,卡死非正常退出重新连接上去再编辑,Vi一般会进入冲突模式,一般被你所编辑的文件会产生一个临时文件,是.swp后缀的,可以删掉。
基础Shell编程
Shell的运行方式
Interactive交互式:根据屏幕反馈再考虑执行下一个命令时,每次交互只执行一条命令。
Batch批处理:使用者事先写好一个Shell程序,然后通过命令方式执行这个程序,这个程序中又包含很多其他功能在一起批量实现
第一行表示系统解析器的位置;第二行是echo语法,显示出相关字符
作为可执行文件,确保文件可执行
变量
定义变量
在 Shell 编程中,变量是用于存储数据值的名称。
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="runoob"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
-
只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
-
不能以数字开头: 变量名不能以数字开头,但可以包含数字。
-
避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
-
使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
-
避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
-
避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。
使用变量
使用一个定义过的变量,只要在变量名前面加$符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)
变量作用域
局部变量:只在当前脚本或当前命令行环境中有效的变量。
环境变量:所有程序和 软件被通过命令行启动时可以访问到的变量
Shell特殊变量:一组特殊变量,用来帮助解决编写脚本时输入/输出的问题。
命令替换
需要将某些命令执行的结果存储到一个变量中,以便后面使用,这是就需要使用反引号``来实现(就是1前面那个键)
例如
运行就会得到:
运算符
算术运算符
+、-、*、/
取余:%、赋值:=;相等比较:==;不等比较:!=
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的结果时数字(如真假)关系运算符返回的值总是真或者假。
相等运算符:-eq
不等运算符:-ne
左边大于右边:-gt
左边小于右边:-it
左边是否大于等于右边:-ge
左边是否大于等于右边:-le
布尔运算符
非运算符:!
或运算符:-o
与运算符:-a
字符串运算符
字符串等于符:=
字符串不等符:!=
字符串长度为0:-z
字符串长度不为0:-n
字符串为空:str
if($a)
then
echo "$a :string is not empty"
else
echo"$a :string is empty"
文件测试运算符
Shell常用指令,常用来判断文件的各种情况
检测文件是否为块设备:-b file
检测文件是否为字符设备:-c flie
检测文件是否为目录:-d flie
检测文件是否为普通文件:-f file
检测文件是否为管道文件:-p flie
检测文件是否可读:-r file
检测文件是否可写:-w file
检测文件是否可执行:-x file
检测文件是否为空:-s file
检测文件是否存在:-e file
file="/var/test.sh"
if[-r $file]
then
echo "File has read access"
注释语法
注释内容不被执行,仅仅用来说明。Shell不支持多行注释,每次只能注释一行,以#开头的内容到换行位置表示注释。
字符串
单字符串
abc='only string'
单字符串不支持任何变量,所有信息都直接输出
转义字符串
dd='hello'
adc="${dd} world is \"Smart Router"\!"
转义字符串中可以直接显示变量,也支持转移符号。
字符串拼接
yourname="axwrt"
greeting=$yourname"is branch of openwrt !"
获取字符串长度
string="hello world!"
echo ${#string}
提取字符
string="hello world"
echo ${strin:1:4}
条件判断
单结果判断if
if [表达式]
then
如果成立则执行
fi
双结果判断if else
if [表达式]
then
如果成立则执行
else
如果不成立则执行
fi
多结果判断if elif else
if [表达式1]
then
如果表达式1成立则执行
elif [表达式2]
then
如果表达式2成立则执行
else
如果都不成立则执行
fi
循环表达
循环for
for 变量 in 列表
do
指令
done
循环while
while 指令内容
do
在指令内容为真的情况下执行
done
中断全部循环 break/continue
两者用法完全相同,唯一区别是break退全部循环,而continue只退出一级
输入/输出重定向
我们在屏幕上能看到的信息虽然实在同一个地方显示的,其实来源是两个不同的途径,也叫做管道,分别是
STDOUT(标准输出),以字符1为代表,大部分的打印或显示函数以及语法都是通过这个管道输出的;
STDERR(标准错误输出),以字符2为代表,大部分错误只要程序写的规范,错误信息就是通过这个管道输出的。
例如使用>将STDOUT改变到display文件中。
如果使用>>就是追加STDOUT信息,而不是覆盖掉已有的。
使用黑洞,一劳永逸
我们写程序时,负责启动一个服务,但是服务经常乱显示,也不适合将显示的信息放在一个文件中,显示的东西实在没有任何用处,就需要Linux的设备文件(黑洞)。它永远是空的,凡是扔进去的都一去不复返。就是 /dev/null
例如,没有扔STDERR的时候,错误信息都显示在屏幕上。
将STDERR扔在黑洞。
将STDOUT和STDERR全部扔到黑洞中。