———————————————————————————————————
####关于变量####
———————————————————————————————————
readonly
只读变量
unset
删除变量,变量删除后不能再次使用,且不能删除只读变量
———————————————————————————————————
echo ${#string}
# 统计str长度
———————————————————————————————————
echo ${string:1:4}
# 输出2-4号字符
———————————————————————————————————
echo expr index "$string" io
# 输出 i或o第一次出现的index
———————————————————————————————————
echo ${array_name[@]} echo ${array_name[*]}
# 输出数组中所有元素 两者并无区别
———————————————————————————————————
:>>!
/# 多行注释
!
———————————————————————————————————
$0 获取文件名(包含路径) $1、2、3 …… 第一、二、三……个参数 注意,
10
不
能
获
取
第
十
个
参
数
,
获
取
第
十
个
参
数
需
要
10 不能获取第十个参数,获取第十个参数需要
10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
———————————————————————————————————
$# 传递到脚本的参数个数
———————————————————————————————————
∗
以
一
个
单
字
符
串
显
示
所
有
向
脚
本
传
递
的
参
数
。
无
论
长
度
多
少
,
都
是
那
么
多
个
参
数
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
如
"
* 以一个单字符串显示所有向脚本传递的参数。 无论长度多少,都是那么多个参数 ——————————————————————————————————— 如"
∗以一个单字符串显示所有向脚本传递的参数。无论长度多少,都是那么多个参数———————————————————————————————————如"*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
———————————————————————————————————
$$ 脚本运行的当前进程ID号
———————————————————————————————————
$! 后台运行的最后一个进程的ID号
———————————————————————————————————
$@ 与
∗
相
同
,
但
是
使
用
时
加
引
号
,
并
在
引
号
中
返
回
每
个
参
数
。
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
—
如
"
*相同,但是使用时加引号,并在引号中返回每个参数。 ——————————————————————————————————— 如"
∗相同,但是使用时加引号,并在引号中返回每个参数。———————————————————————————————————如"@“用「”」括起来的情况、以"$1" “
2
"
…
"
2" … "
2"…"n” 的形式输出所有参数。 有多少长度,就有多少个参数
———————————————————————————————————
$- 显示Shell使用的当前选项,与set命令功能相同。
———————————————————————————————————
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
———————————————————————————————————
####运算符####
———————————————————————————————————
一般的用这个即可 expr $a [+-(\*)/%] $b
———————————————————————————————————
-eq
检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。 equal
-ne
检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。 not equal
-gt
检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。 greater than
-lt
检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。 less than
-ge
检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。 greater equal
-le
检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。 less equal
———————————————————————————————————
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
———————————————————————————————————
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]]
返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]]
返回 true
———————————————————————————————————
布尔运算与逻辑运算的区别
语法区别
从上述举例中可以看出使用逻辑运算符需要加上[[双大括号]],布尔运算符只需要[单大括号]。
功能区别
逻辑运算符具有特殊的短路功能,可以利用短路特性来实现使用命令1的执行结果(执行shell命令后会得到一个状态码)控制命令2是否执行的效果。
举例
[[ cmd1 && cmd2]]
当cmd1false,则cmd2不执行.当cmd1true,则执行cmd2.
[[ cmd1 || cmd2]]
当cmd1false,则cmd2执行.当cmd1true,则cmd2不执行.
———————————————————————————————————
字符串运算符
-z
检测字符串长度是否为0,为0返回 true。 [ -z $a ]
返回 false。
-n
检测字符串长度是否不为 0,不为 0 返回 true。 [ -n "$a" ]
返回 true。
$
检测字符串是否为空,不为空返回 true。 [ $a ]
返回 true。
———————————————————————————————————
-b file
检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file
检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file
检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file
检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file
检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
-S
: 判断某文件是否 socket。 [ -S $file ] 返回 true。
-L
: 检测文件是否存在并且是一个符号链接。 [ -L $file ] 返回 true。
———————————————————————————————————
``read` 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
read name
则在运行脚本的时候需要输入name参数
———————————————————————————————————
echo -e
#表示开启转义 \c表示不换行
———————————————————————————————————
####printf命令####
———————————————————————————————————
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),
任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。
format-string为双引号
printf "%d %s\n" 1 "abc"
单引号与双引号效果一样
printf '%d %s\n' 1 "abc"
没有引号也可以输出
printf %s abcdef
格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
———————————————————————————————————
####test命令####
———————————————————————————————————
if test $[num1] -eq $[num2]
这行中加不加[]都行
[] 执行基本的算数运算,如: result=$[a+b]
———————————————————————————————————
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
还存在布尔运算符
———————————————————————————————————
####流程控制####
———————————————————————————————————
if、for while的判断条件之后加不加“;”看情况
if value # 这种就可加可不加
then
echo "true!"
else
echo "false!"
fi
if value;then # 但此处必须要加,表分隔
echo "true;"
else
echo "false;"
fi
for file in `ls /etc`; do
或
for file in $(ls /etc); do
———————————————————————————————————
while(( $int<=5 ))
do
echo $int
let "int++"
done
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
———————————————————————————————————
######################关于括号的各种作用##### https://blog.csdn.net/taiyang1987912/article/details/39551385
简单点说,括号一般在命令替换的时候使用 $(ls -l)
双圆括号一般表达高级数学表达式 if(( $val1 ** 2 > 90 ))
int++
等等
单方括号 一般用于比较
双方括号提供了字符串比较的高级特性。
括号中可以定义一些正则表达式来匹配字符串
———————————————————————————————————
无限循环语法格式
while :
while true
for (( ; ; ))
———————————————————————————————————
until 循环是当条件为true时结束
———————————————————————————————————
read aNum
case $aNum in
1) echo '你选择了 1'
;; # 表示break
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
———————————————————————————————————
####shell函数####
———————————————————————————————————
定义的名称可以用
function name {}或者 name(){}两种方式
调用时直接写名字即可,参数之间用空格分隔
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum)) # 在(( )) 前面加上$符号获取 (( )) 命令的执行结果
}
funWithReturn
echo "输入的两个数字之和为 $? !"
函数返回值在调用该函数后通过 $? 来获得。
———————————————————————————————————
####标准输入输出####
———————————————————————————————————
command1 < infile > outfile
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
如 cat < yunsuanfu.sh > linshi.sh
———————————————————————————————————
####文件包含####
———————————————————————————————————
. ./name.sh
然后即可获取name.sh里面的参数啥的,可当做自己的使用
# test1.sh 代码如下:
#!/bin/bash
url="http://www.runoob.com"
# test2.sh 代码如下:
#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh
#### 或者使用以下包含文件代码
#### source ./test1.sh
echo "菜鸟教程官网地址:$url"
———————————————————————————————————
参考菜鸟教程