admin管理员组

文章数量:1533124

2024年1月5日发(作者:)

1、运行Shell脚本有两种方法。

1)作为可执行程序

将上面的代码保存为,并 cd 到相应目录:

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

./ #执行脚本

2)作为解释器参数

这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:

/bin/sh

3)当前shell环境执行,.或者source 执行。

2、./ 和 sh的使用区别

1)使用“./”执行脚本,对应的脚本必须要有执行权限(绿色);

2)使用“sh” 执行脚本,对应的没有执行权限,亦可执行;

如果我直接运行./,首先你会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的shell(大多数linux默认是bash),如果指定了解释器,那么就将该脚本交给指定的解释器

比如文件内容是这个:

#!/usr/bin/python

print("This is Python script")

那么你如果运行./,结果就是输出一行文字,但是如果你运行sh ,会报错。

sh:#!/bin/bash 可以不写。因为将作为参数传给sh(bash)命令来执行的,这时不是自己来执行,而是被人家调用执行,所以不要执行权限,采用系统默认bash解释器。

6)Shell文件包含

例如,创建两个脚本,一个是被调用脚本 ,内容如下:

echo "shell测试"

一个是主文件 ,内容如下:

#!/bin/bash

. ./

echo $url

执行脚本:

$chomd +x

./

shell测试

注意:被包含脚本不需要有执行权限。

2、Shell变量

Shell变量的定义、删除变量、只读变量、变量类型。

1)定义变量

Shell 支持以下三种定义变量的方式:

variable=value

variable='value'

variable="value"

3)变量的单引号和双引号的区别

#!/bin/bash

url="中文网11"

website1='中文网:${url}'

website2="中文网:${url}"

echo $website1

echo $website2

运行结果:

中文网:${url}

中文网:中文网11

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

严长生的建议:如果变量的内容是数字,那么可以不加引号;如果真的需要原样输出就加单引号;其他没有特别要求的字符串等最好都加上双引号,定义变量时加双引号是最常见的使用场景。

单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号里可以出现转义字符

4)将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式:

variable=`command`

variable=$(command)

3、特殊变量

$0 当前脚本的文件名

$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$# 传递给脚本或函数的参数个数。

$* 传递给脚本或函数的所有参数。

$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$? 上个命令的退出状态,或函数的返回值。

$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。ProcessID PID

当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。(dollar)

请看下面的脚本:

#!/bin/bash

echo "File Name: $0"

echo "First Parameter : $1"

echo "Second Parameter : $2"

echo "Quoted Values: $@"

echo "Quoted Values: $*"

echo "Total Number of Parameters : $#"

运行结果:

$./ Zara Ali

File Name : ./

First Parameter : Zara

Second Parameter : Ali

Quoted Values: Zara Ali

Quoted Values: Zara Ali

Total Number of Parameters : 2

5、Shell运算符

Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。

1)算数运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr

最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作

例如,两个数相加:

#!/bin/bash

val=`expr 2 + 2`

echo "Total value : $val"

注意:

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。

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

算术运算符列表

运算符

+

-

*

/

%

=

==

!=

注意:

加法

减法

乘法

除法

取余

赋值

相等。用于比较两个数字,相同则返回 true。

说明 举例

`expr $a + $b` 结果为 30。

`expr $a - $b` 结果为 10。

`expr $a * $b` 结果为 200。

`expr $b / $a` 结果为 2。

`expr $b % $a` 结果为 0。

a=$b 将把变量 b 的值赋给 a。

[ $a == $b ] 返回 false。

不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

乘号(*)前边必须加反斜杠()才能实现乘法运算

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

2)关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

关系运算符列表

运算符

-eq

-ne

-gt

-lt

-ge

-le

说明

检测两个数是否相等,相等返回 true。

检测两个数是否相等,不相等返回 true。

检测左边的数是否大于右边的,如果是,则返回 true。

检测左边的数是否小于右边的,如果是,则返回 true。

检测左边的数是否大等于右边的,如果是,则返回 true。

举例

[ $a -eq $b ] 返回 true。

[ $a -ne $b ] 返回 true。

[ $a -gt $b ] 返回 false。

[ $a -lt $b ] 返回 true。

[ $a -ge $b ] 返回 false。

检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

3)布尔运算符

布尔运算符列表

运算符

!

-o

-a

说明 举例

非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。

或运算,有一个表达式为 true 则返回 true。

与运算,两个表达式都为 true 才返回 true。

[ $a -lt 20 -o $b -gt 100 ] 返回 true。

[ $a -lt 20 -a $b -gt 100 ] 返回 false。

4) 字符串运算符

字符串运算符列表

运算符

=

!=

-z

-n

str

说明

检测两个字符串是否相等,相等返回 true。

举例

[ $a = $b ] 返回 false。

检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。

检测字符串长度是否为0,为0返回true。 [ -z $a ] 返回 false。

检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。

检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

5)文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。

例如,变量 file 表示文件“/var/www/tutorialspoint/unix/”,它的大小为100字节,具有 rwx 权限。

#!/bin/sh

file="/var/www/tutorialspoint/unix/"

if [ -r $file ]

then

echo "File has read access"

else

echo "File does not have read access"

fi

文件测试运算符列表

操作符 说明 举例

[ -b $file ] 返回 false。

[ -c $file ] 返回 false。

[ -d $file ] 返回 false。

-b file 检测文件是否是块设备文件,如果是,则返回 true。

-c file 检测文件是否是字符设备文件,如果是,则返回 true。

-d file 检测文件是否是目录,如果是,则返回 true。

-f 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。

[ -g $file ] 返回 false。

[ -k $file ] 返回 false。

[ -p $file ] 返回 false。

[ -u $file ] 返回 false。

[ -r $file ] 返回 true。

[ -w $file ] 返回 true。

[ -x $file ] 返回 true。

[ -s $file ] 返回 true。

[ -e $file ] 返回 true

-x file 检测文件是否可执行,如果是,则返回 true。

-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。

-e file 检测文件(包括目录)是否存在,如果存在,则返回 true。

11、if else语句

Shell 有三种 if ... else 语句:

if ... fi 语句;

if ... else ... fi 语句;

if ... elif ... else ... fi 语句。

12、test命令

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

1)数值测试

参数 说明

-eq 等于则为真

-ne 不等于则为真

-gt 大于则为真

-ge 大于等于则为真

-lt 小于则为真

-le 小于等于则为真

例如:

num1=100

num2=100

if test $[num1] -eq $[num2]

then

echo 'The two numbers are equal!'

else

echo 'The two numbers are not equal!'

Fi

14、for循环

语法:

for 变量 in 列表

do

command1

command2

...

commandN

done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。

例子:显示主目录下以 .bash 开头的文件:

#!/bin/bash

for FILE in $HOME/.bash*

do

echo $FILE

done

运行结果:

/root/.bash_history

/root/.bash_logout

/root/.bash_profile

/root/.bashrc

18、Shell函数

1)定义

Shell 函数的定义格式如下:

function_name () {

list of commands

[ return value ]

}

也可以在函数名前加上关键字 function。

2)函数返回值

可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

Shell函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument

required”。

如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

调用函数只需要给出函数名,不需要加括号。

20、Shell输入输出重定向

Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器。

1)输出重定向

命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。

命令输出重定向的语法为:

$ command > file

这样,输出到显示器的内容就可以被重定向到文件。

输出重定向会覆盖文件内容,请看下面的例子:

$ echo line 1 > users

$ cat users

line 1

2)输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command < file

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

例如,计算 users 文件中的行数,可以使用下面的命令:

$ wc -l users

2 users

也可以将输入重定向到 users 文件:

$ wc -l < users

2

注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

4)Here Document EOF

Here Document 目前没有统一的翻译,这里暂译为”嵌入文档“。Here Document是 Shell

中的一种特殊的重定向方式,它的基本的形式如下:

command << delimiter

document

delimiter

它的作用是将两个 delimiter(分界符)之间的内容(document) 作为输入传递给command。

EOF是End of file的缩写,自定义终止符。

下面的例子,通过 wc -l 命令计算 document 的行数:

$wc -l << EOF

This is a simple lookup program

for good (and bad) restaurants

in Cape Town.

EOF

3

5)/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是/dev/null 文件非常有用,将命令的输出重定向到它,会起到”禁止输出“的效果。

21 项目中shell

1、定时建文件夹,:

定时任务,每天00:01在前置机相应目录下创建当前日期文件夹。

#前置机

host1=''

ftpuser1=xxx

ftppasswd1=xxx

#获取当前日期及时间

day=`date + %Y%m%d` --20210501

#ftp连接前置机

ftp -nv <

open $host1

user $ftpuserl $ftppasswd1

binary

prompt off

cd /xxx/download/xx

mkdir $day

cd /xxx/upload/xx

mkdir $day

bye

FTPEND

2、从前置机下载文件到应用服务器

#$1下载文件名 $2本地存放文件的目录 $3前置机存放文件的目录

if[ -z "$1" ]

then

echo "the fileName is empty"

exit

fi

if[ -z "$2" ]

then

echo "the localPath is empty"

exit

fi

if[ -z "$3" ]

then

echo "the remotePath is empty"

exit

fi

remotePath=$3

host1=''

ftpuser1=xxx

ftppasswd1=xxx

ftp -nv <

open $host1

user $ftpuserl $ftppasswd1

binary

prompt off

cd $3

1cd $2

get $1

bye

FTPEND

5、清理临时文件 每月十号。

* * 10 * * sh /data/xxx/xx/

#!/bin/bash

#删除临时文件夹

folder=/xxx/xxx/xx

lastMonth=`date -d "1 month ago" +%Y%m`

echo"----------`date+%Y%m%d`--------------"

if [ -d $folder ]

then

#遍历文件夹

for sfolder in $(1s $folder)

do

folderMonth=${sfolder:0:6}

echo"临时文件:<$folderMonth>”

if [ $lastMonth = $folderMonth ] -- 上月=文件夹名

then

rm -rf $folder/$sfolder

echo"$sfolder删除成功"

else

echo"$sfolder保留"

done

22、面试题

1、liunix查看磁盘空间,查看内存空间命令

dh -f du free

1、liunx查看日志某一行

tail -n 100 file

tail -n +100 file 从100行开始,显示后面的

head -n 100 file

sed -n ‘5,10p’ file 显示5-10行

2、linux查找文件命令

find locate

本文标签: 文件变量命令脚本