shell快速上手

告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

#!/bin/bash

运行脚本方式:

chmod +x ./test.sh  # 使脚本具有执行权限
./test.sh  # 执行脚本

'''
一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,
直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,
而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,
你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,
要用 ./test.sh 告诉系统说,就在当前目录找。
'''

作为解释器参数:

/bin/sh test.sh
/bin/php test.php
不需要在第一行指定解释器信息


扩展名不影响脚本执行,见名知意就好,如test.python


输出语句:

# 可用printf代替,更加强大
printf

# 普通输出
echo Hello World!

# 显示转义字符
echo '\'Hello World!\''

# 接受输入变量
read name
echo "$name It is a test"

# 开启转义,类似换行
echo -e "OK! \n"

# 显示不换行
echo -e "OK! \c" # -e 开启转义 \c 不换行

# 显示结果定向至文件
echo "It is a test" > myfile

# 显示命令执行结果, 举例当前时间, 使用反引号`
echo `date`

%s %c %d %f 都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来
%-4.2f 指格式化为小数,其中.2指保留2位小数。

序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 不显示输出结果中任何结尾的换行字符,(只在%b格式指示符控制下的参数字符串中有效)
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符

变量

定义变量:
a=’Hello World’

使用变量:
使用定义的变量,在前面加$, 加{}帮助解释器识别变量的边界

只读变量:
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

删除变量

unset 变量

变量被删除后不能再次使用。unset 命令不能删除只读变量。

  • 变量名和等号之间不能有空格
  • 遵循python起名规范

可以遍历linux命令

# 遍历当前目录所有文件
for temp in 'ls ./'

# 也可以读取某个sh文件
file="/var/www/runoob/test.sh"

# 可以切换某个目录
cd /bin

字符串

单引号

  • 任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 不能出现单引号(对单引号使用转义符后也不行)。

双引号

  • 可以有变量
  • 可以出现转义字符

语法

# 查询字符串长度, 从1开始
echo ${#string}

# 7 表示左边第8个字符开始,一直到结束。
echo ${var:7}
# 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
# 提取子字符串, 结果要在下标上1
echo ${string:1:4}
# var 是变量名
# #号是运算符
# #*// 表示从左边开始删除第一个 // 号及左边的所有字符
# ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
# %*// 表示从右边开始,删除第一个 / 号及右边的字符
echo ${var#*//}
# %%*// 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符

# 查找子字符串, 查找子字符串, 比如is
string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8

数组

  • 支持一维数组,不支持多维,下标从0开始
  • 用()表示数组, 用空格分隔

语法

# 读取数组
${数组名[下标]}

# 获取数组中所有元素
echo ${array_name[@]}

# 获取数组长度
length=${#array_name[@]}
length=${#array_name[*]}
# 取单个元素的长度
lengthn=${#array_name[n]}

注释

# 单行注释

在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,
可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,
没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。


shell传递参数

运行脚本的时候, 脚本获取参数格式为 $n, n代表一个数字, 0为执行文件名, 1为脚本第一个参数

参数处理 说明
$# 传递到脚本的参数个数
$* 以整体形式返回一个参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同, 但是使用时加引号,返回多个参数
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

Shell基本运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

注意使用的是反引号 ` 而不是单引号 ‘

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算数运算符

表达式和运算符之间要有空格, 例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被 ` ` 包含

val=`expr 2 + 2`
echo "两数之和为 : $val"
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30
* 乘法 `expr $a \* $b` 结果为 200
% 取余 `expr $b % $a` 结果为 0
= 赋值 a=$b 将把变量 b 的值赋给 a
== 相同则返回 true [ $a == $b ] 返回 false
!= 同上,取反 !=

条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

关系运算符

只支持数字,不支持字符串,除非字符串的值是数字。
假设变量a为10, b为20

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false
-ne 检测两个数是否相等,不相等返回 true [ $a -ne $b ] 返回 true
-gt 大于,成立返回true [ $a -gt $b ] 返回 false
-lt 小于, 成立返回true [ $a -lt $b ] 返回 true
-ge 大于等于
-le 小于等于

布尔运算符

运算符 说明 举例
! 非运算,成立返回false, 否则返回true [ ! false ] 返回 true
-o 或运算 有一个表达式为 true 则返回 true
-a 与运算 [ $a -lt 20 -a $b -gt 100 ] 返回 false

逻辑运算符

运算符 说明 举例
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串运算符

假定变量 a 为 “abc”,变量 b 为 “efg”

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true [ $a = $b ] 返回 false
!= 检测两个字符串是否相等,不相等返回 true
-z 检测字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
-n 检测字符串长度是否为0,不为0返回 true [ -n $a ] 返回 true
str 检测字符串是否为空,不为空返回 true [ $a ] 返回 true

文件测试运算符

没写


Shell test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:”!”最高,”-a”次之,”-o”最低

参数 说明
数值测试
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
字符串测试
= 等于则为真
!= 不相等则为真
-z 字符串 -z 字符串
-n 字符串 字符串的长度不为零则为真
文件测试
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

# echo
# 两个数相等!
# -----------------------------
a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

# echo
# a=5
b=6

result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"

# ----------------------------------------
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

# echo
# 两个字符串不相等!

# -------------------------------------
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

# echo
# 文件已存在!

# ------------------------------------------
cd /bin
if test -e ./notFile -o -e ./bash
then
    echo '有一个文件存在!'
else
    echo '两个文件都不存在'
fi

# echo
# 有一个文件存在!

Shell流程控制

如果else分支没有语句执行,就不要写这个else

if else语句经常与test命令结合使用

if else

if condition
then
    command1 
    command2
    ...
    commandN
else:
    command 
fi

# 末尾的fi就是if倒过来拼写,后面还会遇到类似的。

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件

while condition
do
    command
done

# -------------------------------

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done
# let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

until循环

until循环执行一系列命令直至条件为真时停止。

until循环与while循环在处理方式上刚好相反。
一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

until condition
do
    command
done

case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

casein
模式1)
    command1
    ;;
模式2)
    command1
    ;;
*)
    没有被匹配到的
    ;;
esac

Shell函数

  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
  • $10 不能获取第十个参数,获取第十个参数需要${10} 当n>=10时,需要使用${n}来获取参数
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

导包

source firename
可以直接引用包里的变量, 被包含的文件不需要可执行权限

猜你喜欢

转载自blog.csdn.net/qq351469076/article/details/79149405