shell定义变量规范:
一、shell定义变量时,变量名不加美元符号,如:your_name=“rose”
- 变量名和等号之间不能有空格
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(最下方有关键字表)
符合条件的示例:
runoob
LD_PATH
_var
var2
二、使用一个定义过的变量,只要在变量名前面加美元符号即可
your_name=“rose”
echo $your_name
echo ${your_name}(括号可有可无)
三、已定义的变量,可以被重新定义
your_name=“rose”
echo $your_name
your_name=“jack”
echo $your_name输出结果是:
rose
jack
四、删除变量:
使用unset命令可以删除变量
unset variable_name
变量被删除后不能再次使用,unset不能删除只读变量
五、变量类型,运行shell时,会同时存在三种变量:
- 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行,必要的时候shell脚本也可以定义环境变量。
- shell变量:shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
shell字符串:
字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不用引号。
- 单引号:
str=‘this is a string’
(1)单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
(2)单引号字符串中不能出现单独一个单引号(对单引号使用转义符后也不行,但可成对出现,作为字符串拼接使用) - 双引号:
your_name=‘nnn’
str=“I konw you are \”$your_name\"! \n"
echo -e $str (注:echo -e 激活转义字符)
输出结果:
I konw you are “nnn”!
双引号优点:
(1)双引号里可以有变量
(2)双引号里可以出现转义字符
一、获取字符串长度:
string=“abcd”
echo ${string}
输出结果:4
二、提取子字符串:
string=“runnob is a great site”
echo $(string:1:4)
输出结果:unno
(字符上方对应的是01234…,把1位置的字符当做第一个,计数4个,返回)
三、查找子字符串:
查找字符i或o的位置(哪个字符先出现就计算哪个)
string="runoob is a great site"
echo `expr index "$string" io`
输出结果:4
shell数组:
一、读取数组元素:
valuen=${array_name[n]}
二、使用@符号可以获取数组中所有元素:
echo ${array_name[@]}
三、获取数组长度:
length=${#array_name[@]}
length=${#array_name[*]}
四、()和{}的区别:
()表示在"nested sub-shell"中划分一个命令群组,如果我们希望里面的命令对之前和之后的设定不影响的话,就要用(),反之,用{}。
例1:
$cat shell.sh; ./shell.sh
#! /bin/bash
line="123 25 36522"
(
line="wwww"
echo "$line"
)
echo "$line"
输出结果:
wwww
123 25 36522
例2:
$cat shell.sh; ./shell.sh
#! /bin/bash
line="123 25 36522"
{
line="wwww"
echo "$line"
}
echo "$line"
输出结果:
wwww
wwww
shell的匹配:
假设定义了一个变量为:
代码如下:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
#是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
shell运算符:
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
具体参考:https://www.runoob.com/linux/linux-shell-basic-operators.html
shell的关键字:
命令 | 含义 |
---|---|
! | 保留字,逻辑非 |
: | 不做任何事,只做参数展开 |
. | 读取文件并在shell中执行它 |
alias | 设置命令或命令行别名 |
bg | 将作业置于后台运行 |
bind | 将关键字序列与readline函数或宏捆绑 |
break | 保留字,跳出for、while、until、select循环 |
builtin | 调用命令的内建命令格式,而禁用同名的函数。或者同名的扩展命令 |
case | 保留字,多重选择 |
cd | 切换当前工作目录 |
command | 找出内建和外部命令;寻找内建命令而非同名函数 |
continue | 保留字,到达下次for、while、until、select循环 |
declare | 声明变量定义变量属性 |
dirs | 显示当前存储的列表 |
disown | 将作业从列表中移除 |
do | 保留字,for、while、until、select循环的一部分 |
done | 保留字,for、while、until、select循环的一部分 |
echo | 打印参数 |
elif | 保留字,if结构的一部分 |
else | 保留字,if结构的一部分 |
enable | 开启和关闭内建命令 |
esac | 保留字,case的一部分 |
eval | 将参数作为命令再次处理一遍 |
exec | 以特定程序取代shell或为shell改变I/O |
exit | 退出shell |
export | 将变量声明为环境变量 |
fc | 与历史命令一起运行 |
fg | 将作业置于后台运行 |
fi | 保留字,if循环的一部分 |
function | 定义一个函数 |
for | 保留字,for循环的一部分 |
getops | 处理命令行选项 |
hash | 记录并指定命令的路径名 |
help | 显示内建命令的帮助信息 |
history | 显示历史信息 |
if | 保留字,if循环的一部分 |
in | 保留字,case、for、select循环的一部分 |
jobs | 显示后台运行的作业 |
kill | 向进程传送信号 |
let | 使变量执行算术运算 |
local | 定义局部变量 |
logout | 从Shell中注销 |
popd | 从目录栈中弹出目录 |
pushd | 将目录压入栈 |
pwd | 显示当前工作目录 |
read | 从标准输入中读取一行 |
readonly | 将变量定义为只读 |
return | 从函数或脚本返回 |
select | 保留字,生成菜单 |
set | 设置Shell选项 |
shift | 变换命令行参数 |
suspend | 终止Shell的执行 |
test | 评估条件表达式 |
then | 保留字,if结构的一部分 |
time | 保留字,输出统计出来的命令执行时间,其输出格式由TIMEFORMAT变量来控制 |
times | 针对Shell及其子Shell,显示用户和系统CPU的时间和 |
trap | 设置扑捉程序 |
type | 确定命令的源 |
typeset | 声明变量,定义变量属性,与declare等价 |
ulimit | 设置和显示进程占用的资源限制 |
umask | 设置和显示文件权限码 |
unalias | 取消别名定义 |
unset | 取消变量或函数定义 |
until | 保留字,一种循环结构 |
wait | 等待后台作业完成 |
while | 保留字,一种循环结构 |