1、环境变量
(1)环境变量分为全局环境变量和局部环境变量。
系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。用户定义的局部变量建议使用小写字母。
使用环境变量时,需要在变量前面加 $。操作环境变量时,不使用$。(注:$HOME 等同于 ~,表示某个用户的主目录。)
显示某个特定进程设置的所有环境变量:set
设置局部环境变量:(1)echo $my_variable,(2)赋值:my_variable=Hello 或者 my_variable="hello world"。注意:变量名、等号和值之间没有空格。
向变量中存储的已有文本字符串尾部添加文本的常用方法:
variable="Alabama Alaska Arizona" variable=$variable" Connecticut"
设置全局环境变量:(1)echo $my_variable,(2)赋值:同上,(3)export my_variable。
变量之间赋值:my_variable=$other_variable
删除环境变量:unset my_variable。
当前的PID:$$
(2)数组变量
给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。
格式:my_variable=(one two three four five ......)
引用数组中的某个元素:${my_variable[n]};#索引值n从0开始。
显示整个数组变量:${my_variable[*]}
改变某个索引值的位置:my_variable[n]=10
删除数组中的某个值:unset my_variable[n];注意:删除后,后面的元素还是保持在原有位置,被删除的位置还存在,只不过值为空。
删除整个数组:unset my_variable
2、文件权限
(1)使用文件权限符:
-:代表文件 d:代表目录 l:代表链接 c:代表字符型设备 b:代表块设备 n:代表网络设备
之后有3组三字符的编码,每一组定义了3种访问权限:r代表对象是可读的,w代表对象是可写的,x代表对象是可执行的。如果没有某种权限,在该权限位会出现单破折线。
3组权限分别对应对象的3个安全级别:对象的属主、对象的属组、系统的其他用户。
三字符对应存在一个八进制值,例如:rwx:7,rw-r--r--:644
(2)显示和设置默认权限:umask
文件的原始权限为:666,即所有用户都有读和写的权限。
目录的原始权限为:777,即所有用户都有读、写和可执行。
为什么上面图片中-rw-r--r--的八进制表示为644?因为该系统具有默认权限022,因此剩下的文件权限为644=666-022。
注意:umask命令显示得到的默认权限其实有4位,即0022,第一位是用于共享文件中的安全特性,具体细查。
3、vim编辑器
(1)普通模式下,vim编辑器提供了一些命令来编辑缓冲区中的数据。
删除当前光标所在位置的n个字符:(n)x 删除当前光标所在位置的n行:(n)dd 删除当前光标所在位置的n个单词:(n)dw
删除当前光标所在位置至行尾的内容:d$ 删除当前光标所在行行尾的换行符(拼接行):J
撤销前一编辑命令:u 在当前光标后追加数据:a 在当前光标所在行行尾追加数据:A
用char替换当前光标所在位置的单个字符:r char 用text覆盖当前光标所在位置的数据,直到按下ESC键:R text
复制当前光标所在位置的n行:(n)yy 复制当前光标所在位置的n个单词:(n)yw 复制当前光标所在位置至行尾的内容:y$
复制第26行至50行:命令模式下,:26,50y
粘贴:p
查找:/查找的文本 向下查找:n 向上查找:N
替换当前行的old为new::s/old/new 替换当前行所有old为new::s/old/new/g
替换第n行开始到最后一行中每一行的第一个old为new::n,$s/old/new/
替换第n行开始到最后一行中每一行所有的old为new::n,$s/old/new/g
替换整个文件中的所有old::%s/old/new/g 替换整个文件中的所有old,但在每次出现时提示::%s/old/new/gc
4、shell脚本文件
(1)脚本文件:第一行为:#!/bin/bash(!表示告诉shell用哪个shell来运行脚本。)
脚本文件test:
#!/bin/bash
echo this is a test file.
date
运行脚本文件:(1)test;一般会报错bash: test: command not found。此时可以将shell脚本文件所处的目录添加到PATH环境变量中;(2)./test;使用绝对或相对文件路径来引用shell脚本文件。
(2)命令替换:从命令输出中提取信息,并将其赋给变量。
将命令输出赋给变量:反引号字符(··)和$()。
例:variable_output=`date` 或 variable_output=$(date)
(3)重定向输入和输出
例如:command > outputfile 或 command >> outputfile
输出重定向 > :将命令的输出发送到一个文件中,如果该文件已有内容,则会被覆盖。
输出重定向并追加内容>>:将命令的输出发送到一个文件中,如果该文件已有内容,则会追加到之前内容后面。
例如:command < inputfile
输入重定向 <:将文件的内容重定向到命令。
例如:command << marker
data
marker
内联输入重定向 <<:必须指定一个文本标记marker来划分输入数据的开始和结尾。任何字符串都可以作为文本标记,但在数据的开始和结尾文本标记必须一致。
(4)管道
例如:command1 | command2 | command3
管道连接 | :将一个命令的输出作为另一个命令的输入。
注意:由管道串起来的命令会同时运行,在系统内部将他们连接起来,在第一个命令产生输出的同时,该输出会被立即送给第二个命令。
(5)执行数学运算
例如:expr 1 \< 5
用来在命令行上处理数学表达式:expr
由于使用expr执行数学运算时,要在运算符前加转义操作符 \,所以不是很方便。
(6)使用方括号
为了解决这个问题,bash shell提供了一种简单的方法来执行数学表达式:使用方括号。
使用方括号能够将一个数学运算结果赋给某个变量:my_variable=$[40 - 20]。
注意:使用方括号不需要在运算符前加转义符号。但是也存在一个问题,即:只支持整数运算(例如:100/45=2)
(7)浮点解决方案
bash计算器:bc(本版本linux中没有,所以用时具体细查。。。)
5、退出脚本
(1)退出状态码
shell中运行的每个命令都使用退出状态码(0-255的整数值)来表明命令结束。
显示上一命令结束后返回的状态码:echo $?
命令成功结束的退出状态码值:0 没找到命令:127
(2)exit命令
exit命令允许在脚本结束时指定一个退出状态码。即:在脚本文件最后一行写入:exit 状态码值。
注意:当返回的退出状态码值超出区间,shell通过对256取模运算后的值作为退出状态码值。
6、结构化命令
(1)使用 if-then语句
格式:
if command 或者 if command; then
then commands
commands fi
fi
解释:当if语句运行后面的那个命令的退出状态码为0时,位于then部分的命令就会被执行,如果状态码为其他值,则then部分的命令就不会被执行。
(2)使用 if-then-else 语句
格式:
if command
then
commands
else
commands
fi
解释:当 if 语句中的命令返回退出状态码0时,then部分中的命令会被执行;当 if 语句中的命令返回非零退出状态码时,else部分中的命令会被执行。
(3)嵌套 if
格式:
if command
then
commands
elif command
then
commands
else
commands
fi
(4)test命令
if-then 语句不能测试命令退出状态码之外的条件,因此bash shell提供test命令在if-then 语句中测试不同条件的途径。如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0。
格式:
if test condition
then
commands
fi
如果 test 命令不加condition部分,它会以非零状态码退出,并执行else语句块。
另外一种测试方法:
if [ condition ] #注意:第一个方括号之后和第二个方括号之前必须加上一个空格。
then
commands
fi
test命令可以判断三类条件:(具体可以细查)
a、数值比较 b、字符串比较 c、文件比较
(5)复合条件测试
if-then 语句中使用布尔逻辑组合测试。两种布尔运算符可用:
(a)[ condition1 ] && [ condition2 ] # 与:两个比较都必须满足才会执行if的then部分
(b)[ condition1 ] || [ condition2 ] # 或:两个比较只需要满足一个以上就会执行if的then部分
(6)if-then 的高级特性
(a)用于数学表达式的双括号
双括号允许在比较过程中使用比 test 命令更高级的数学表达式。格式:(( expression ))
if (( expression ))
then
commands
fi
(b)双方括号——针对字符串比较的高级特性
双方括号中 expression 使用了test命令中采用的标准字符串比较,但它提供了 test 命令未提供的一个特性——模式匹配。
格式:[[ expression ]]
if [[ expression ]]
then
commands
fi
(7)case命令
格式:
case variable in
pattern1 | pattern2) commands1;; # 满足pattern1或pattern2,则执行 commands1
pattern3) commands2;; # 满足pattern3,则执行commands2
*) default commands;; # 都不满足,则执行commands
esac
当在一组可能的值中寻找特定的值时,不得不写出很长的 if-then-else语句,例如
if [[ $USER == "admin0" ]] 改为: case $USER in
then admin0) echo......;;
echo......