一、资料
二、简介
1、Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
2、Shell 脚本(shell script),是一种为 shell 编写的脚本程序
3、运行 Shell 脚本有两种方法:
#!/bin/sh
echo "Hello, Shell!"
#作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
#作为解释器参数
/bin/sh test.sh
4、可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
#!/bin/sh
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
sh test.sh K Z Y
#参数个数
$#
#以字符串形式显示所有参数
$*
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
$@
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
#显示Shell使用的当前选项
$-
三、语法
1、Shell 命令
1、#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
2、以 # 开头的行就是注释,会被解释器忽略
3、echo 命令用于向窗口输出文本
# 显示普通字符串
echo "It is a test"
# 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
# 显示命令执行结果
echo `date`
# 显示结果定向至文件
echo "It is a test" > myfile
4、printf 命令模仿 C 程序库(library)里的 printf() 程序
5、 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
6、[] 执行基本的算数运算
#!/bin/bash
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: $result"
#
result 为: 11
7、expr 是一款表达式计算工具,使用它能完成表达式的求值操作(注意使用的是反引号 ` 而不是单引号 ')
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
8、let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
2、运算符
2.1、算数运算符
条件表达式要放在方括号之间,并且要有空格,例如: [b] 是错误的,必须写成 [
b ]
# 加
val=`expr $a + $b`
# 减
val=`expr $a - $b`
# 乘
val=`expr $a \* $b`
# 除
val=`expr $a / $b`
# 求余
val=`expr $a % $b`
# 等于
if [ $a == $b ]
# 不等于
if [ $a != $b ]
2.2、关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
# -eq 检测两个数是否相等,相等返回 true
if [ $a -eq $b ]
# -ne 检测两个数是否不相等,不相等返回 true
if [ $a -ne $b ]
# -gt 检测左边的数是否大于右边的,如果是,则返回 true
if [ $a -gt $b ]
# -lt 检测左边的数是否小于右边的,如果是,则返回 true
if [ $a -lt $b ]
# -ge 检测左边的数是否大于等于右边的,如果是,则返回 true
if [ $a -ge $b ]
# -le 检测左边的数是否小于等于右边的,如果是,则返回 true
if [ $a -le $b ]
2.3、布尔运算符
# ! 非运算,表达式为 true 则返回 false,否则返回 true
if [ $a != $b ]
# -a 与运算,两个表达式都为 true 才返回 true
if [ $a -lt 100 -a $b -gt 15 ]
# -o 或运算,有一个表达式为 true 则返回 true
if [ $a -lt 100 -o $b -gt 100 ]
2.4、逻辑运算符
# 逻辑的 AND
if [[ $a -lt 100 && $b -gt 100 ]]
# 逻辑的 OR
if [[ $a -lt 100 || $b -gt 100 ]]
2.5、字符串运算符
# = 检测两个字符串是否相等,相等返回 true
if [ $a = $b ]
# != 检测两个字符串是否不相等,不相等返回 true
if [ $a != $b ]
# -z 检测字符串长度是否为0,为0返回 true
if [ -z $a ]
# -n 检测字符串长度是否不为 0,不为 0 返回 true
if [ -n "$a" ]
# 检测字符串是否为空,不为空返回 true
if [ $a ]
2.6、文件测试运算符
file="/var/www/runoob/test.sh"
# -d 检测文件是否是目录,如果是,则返回 true
if [ -d $file ]
3、变量
1、定义变量时,变量名不加美元符号,变量名和等号之间不能有空格
2、使用一个定义过的变量,在变量名前面加美元符号,推荐给所有变量加上花括号
3、使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
4、使用 unset 命令可以删除变量,不能删除只读变量
# 定义
your_name="runoob.com"
# 使用
echo $your_name
echo ${your_name}
a=10
b=20
var=$[a+b]
echo ${var}
4、函数
1、定义格式:
[ function ] funname [()]
{
action;
[return int;]
}
2、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用
3、调用函数仅使用其函数名即可,函数返回值在调用该函数后通过 $? 来获得
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
aNum=$1
anotherNum=$2
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn 1 2
echo "输入的两个数字之和为 $? !"
5、流程控制
sh 的流程控制不可为空,如果 else 分支没有语句执行,就不要写这个 else
# if 语句
if condition
then
command1
command2
...
commandN
fi
# if else 语句
if condition
then
command1
command2
...
commandN
else
command
fi
# 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 condition
do
command
done
# until 循环
until condition
do
command
done
# case 语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
6、文件包含
Shell 也可以包含外部脚本,可以很方便的封装一些公用的代码作为一个独立的文件,Shell 文件包含的语法格式如下:
. filename # 注意点号(.)和文件名中间有一空格
or
source filename
四、数据类型
1、字符串
1、字符串可以用单引号,也可以用双引号,也可以不用引号
2、推荐使用双引号,双引号里可以有变量,双引号里可以出现转义字符
#!/bin/sh
your_name="runoob"
# 使用双引号拼接
greeting="hello, ${your_name} !"
string="runoob is a great site"
#获取字符串长度
echo ${#string}
#提取子字符串
echo ${string:1:4}
#查找子字符串,脚本中 ` 是反引号,而不是单引号 '
echo `expr index "$string" io`
2、数组
1、Shell 只支持一维数组,不支持多维数组
2、在 Shell 中用括号来表示数组,数组元素用"空格"符号分割开
# 定义数组
array_name=(value0 value1 value2)
# 读取数组
${数组名[下标]}
value=${array_name[index]}
# 获取所有元素
${my_array[@]}
# 获取数组长度
${#array_name[@]}
${#array_name[*]}
五、Linux命令
1、文件管理相关命令
// list file(列出目录)
ls
-a 全部
-d 仅列目录
cd // change directory
pwd // print work directory
mkdir // make directory
rmdir // remove directory
cp // copy file
rm // remove
mv // move
2、文件内容相关命令
// 由第一行开始显示文件内容
cat
// 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
tac
// 显示的时候,顺道输出行号!
nl
// 一页一页的显示文件内容
more
// 与 more 类似,可以往前翻页!
less
// 只看头几行
head
// 只看尾巴几行
tail
1、find
find 命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
# 语法
find path -option [ -print ] [ -exec -ok command ] {} \;
# 按名称查找
find . -name test.txt
# 模板查找,注意加引号
find . -name "*.txt"
#查找当前目录及子目录下所有的普通文件
find . -type f -print
#查找当前目录及子目录下所有的目录
find . -type d -print
# 按名称查找,限制最大层级
find . -name "*.txt" -maxdepth 3
2、grep
grep 命令用于查找文件里符合条件的字符串
grep "PodTestTests" . -R -n
# 排除
grep -v
网友评论