#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell
echo 命令用于向窗口输出文本。
chmod 权限控制:
第1个字符有两种情况:如果是“d”则代表这是一个文件夹,如果是“—”代表这是一个文件;
d代表的是目录(directroy)
-代表的是文件(regular file)
s代表的是套字文件(socket)
p代表的管道文件(pipe)或命名管道文件(named pipe)
l代表的是符号链接文件(symbolic link)
b代表的是该文件是面向块的设备文件(block-oriented device file)
c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
第2、3、4个字符:表示文件拥有者的权限,可以用u来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;
第5、6、7个字符:表示文件所属群组的权限,可以用g来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;
第8、9、10个字符:表示的是除拥有者和所属群组之外的其他所有的用户,可以用o来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限。
rwx = 111 = 7; rw- = 110 = 6; r-x = 101 = 5; r-- = 100 = 4; -wx = 011 = 3; -w- = 010 = 2; --x = 001 = 1; --- = 000 = 0
输出:echo "xxx"
echo -e 处理特殊字符
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;(常用)
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;(常用)
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
定义变量:变量名="xxx(内容)" 注意:=前后不能有空格
输出变量内容:echo ${变量名}(推荐) 或者 echo $变量名 如需打印$使用转义字符\,echo命令自带换行
只读变量:readonly 变量名
删除变量:unset 变量名
定义数组: array=("" "" "" "" "")
输出数组:echo -e "\n${array[下标]}" //下标可以是@或者*,表示全部;可以是数字表示数组单个内容
获取数组长度:echo ${#array[@]} //主要功能是#字符
获取单个数组内容长度:echo ${#array[n]} //n是数组内第n单个字符串
多行注释:
:<<自定义字符如 a或者!
自定义字符如a或者! //必须单行,若中间出现自定义字符的字符串需要用转义字符\
参数传递:
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
if [ -n ${1} ]; then 备注:[]中间要用空格
echo "包含第一个参数"
else
echo "不包含第一个参数"
fi 备注:if对应的结尾是fi,没有结尾会报错
Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:
算术比较, 比如一个变量是否为0, [ $var -eq 0 ]。
文件属性测试,比如一个文件是否存在,[ -e $var ], 是否是目录,[ -d $var ]。
字符串比较, 比如两个字符串是否相同, [[ $var1 = $var2 ]]。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
运算符:val=`expr 2 + 2` //注意是反引号`,其中+前后都注意保持空格完整性
算数运算符包括:+ - * / % = == != 备注:由于*是特殊字符,需要转义字符\。在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
关系运算符包括:-eq(等于) -nq(不等于) -gt(大于) -lt(小于) -ge(大于等于) -le(小于等于)
布尔运算符: !(非) -o(或) -a(与)
逻辑运算符:&&(与) ||(或)
定义文件:file="./lujing/wenjian.sh"
文件测试运算符:
-b file:检测文件是否是块设备文件,如果是,则返回 true。
-c file:检测文件是否是字符设备文件,如果是,则返回 true。
-d file:检测文件是否是目录,如果是,则返回 true。
-f file:检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file:检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file:检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file:检测文件是否是有名管道,如果是,则返回 true。
-u file:检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file:检测文件是否可读,如果是,则返回 true。
-w file:检测文件是否可写,如果是,则返回 true。
-x file:检测文件是否可执行,如果是,则返回 true。
-s file:检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file:检测文件(包括目录)是否存在,如果是,则返回 true。
获取当前时间:echo `date` //返回样例:Sun Apr 25 14:54:28 CST 2021
printf:不主动换行 //使用方式:printf 格式 内容1 内容2 ... 内容n(可以有",或者',也可以直接是字符串)
\a:警告字符,通常为ASCII的BEL字符 其实就是$
\b:后退
\c:抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f:换页(formfeed)
\n:换行
\r:回车(Carriage return)
\t:水平制表符
\v:垂直制表符
\\:一个字面上的反斜杠字符
\ddd:表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd:表示1到3位的八进制值字符
printf的格式种类:
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
范例:
$ printf "a string, no processing:<%s>\n" "A\nB" //s是字符串,不会对字符串中的特殊字符做特殊处理
a string, no processing:<A\nB>
$ printf "a string, no processing:<%b>\n" "A\nB" //b回退,即不执行>后面的\n,"A\nB"里的\n还会被当做特殊符号处理
a string, no processing:<A
B>
test 命令:用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
如:if test $[num1] -eq $[num2] //[]中可以进行运算如num1+num2,如不需进行数字运算可以使用{}
字符串测试:=(等于则为真) !=(不相等则为真) -z 字符串(字符串的长度为零则为真) -n 字符串(字符串的长度不为零则为真)
文件测试相关指令:
-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真
grep -c {keyword} //统计文件中{keyword}的个数,可以是ps -ef | grep -c "ssh" 或者grep -c "ssh" 文件名
uname -r:获取系统内核版本号
param++:正常写法${[${param}++]},简便写法let param++
说明:let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
echo -n :不换行输出
无线循环:
while不跟条件或跟true然后直接do 如while :;do ;xxx ;done或者更while true;do ;xxx ;done;或者for (( ; ; ))
until:直到 //范例:until {condition}; do ;xxx ;done
break:跳出循环
continue继续,如果是无线循环则不会结束
函数:functionName(){} //{函数体内容}
函数中的参数传递:函数名 1 2 3 4
函数中的取参:{echo $1}
函数中的参数处理:
$#:传递到脚本或函数的参数个数
$*:以一个单字符串显示所有向脚本传递的参数
$$:脚本运行的当前进程ID号
$!:后台运行的最后一个进程的ID号
$@:与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-:显示Shell使用的当前选项,与set命令功能相同。
$?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。