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
版权声明:本文标题:shell常见面试题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1704461714a92023.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论