shell脚本经典实例100
㈠ 编写一个SHELL脚本程序计算1到100的和
#!/银销bin/锋迟游旦春bash
j=0
for ((i=1;i<=100;i++));do
j=$(($i+$j))
done
echo $j
㈡ shell脚本中使用for.do循环语句列出从1到100的数字中能够被3整除的数求出他们的和并输出文件命名为sum.sh
#!/bin/bash
sum=0
for i in {1..100}
do
if [ $(( $i % 3 )) -eq 0 ]
then
echo $i
sum=$(( $sum + $i ))
fi
done
echo "sum is: $sum"
保存为sum.sh
㈢ shell脚本
Shell脚本基本知识
概述:shell其实是内核与用户之间的一个接口,
shell脚本
如果有一系列经常使用的linux命令,你可以把它们存储在一个文件肿。shenll可以读取这个文件,并执行其中的命令。这样的文件成为脚本文件。
执行shell脚本
要创建一个shell脚本,你要使用任何编辑器比如vi在文本文件中编写他。
为了使用bashshell赖执行脚本magic,其命令是:bashmagic或者./magic
echo命令:
echo“!”
屏幕上就会回显“!”
#符号
用于在shell脚本肿可以包含注解入口
echo“hello”
#thisisacommentline.thiswouldnotproceanyoutput!
echo“world!”
第二行是一个注解的例子。它将被shell忽略,而且不产生任何消息
变量:
可以在任何时间通过简单的赋值来创建。
语法:
<variablename>-<value>
Linux中的所有变量都被当作字符串
引用变量:
$符号用于引用一个变量的内容
variable1=${variable2}
读入值给变量
在执行shell脚本时,shell还允许用户直接从键盘读入一个值给变量,还可以使用read命令来作。
$readfname
本地和全局shell变量
局部变量
当引用shell时,只有创建它的shell能够知道变量的存在
全局变量
称为子shell
shell中创建的变量局部于创建它的shell,除非使用export命令特别指出是全局的。
环境变量:
通过改变这些变量的值,用户能够定制此环境
一些环境变量的例子是HOME,PATH,PS1,PS2,LOGNAME,SHLVL,及SHELL
HOME变量
Linux系统中的每个用户都有一个相关的称作HOME的目录
当一个用户登录后,进入相应的HOME的目录
$echo$HOME
PATH变量
包含一列用冒号定界的目录的路径名字,便于可执行程序的搜索。
PS1变量
PS1(PromptString1)变量包含了shell提示符,$符号
$PS1=“HELLO>”
HELLO>
PS2变量
是为第二个提示符设置值的环境变量
LOGNAME变量
包含用户的注册名字
$echo“${LOGNAME}”
SHLVL变量
该变量包含当前工作的shelllevel
SHELL变量
环境变量存储了用户缺省的shell
env命令
可用来查看所有的已移出的环境变量表和它们各自的值!
命令替换
在单个命令行中使用多个命令的另外一种方法(非Pipes)是通过命令替换
echo“thedatais`date`”
expr命令
用于求之算术表达式。该命令的输出被送到标准输出
$expr4+5
将在屏幕上显示9
算术展开:
你可以在$((…))中括一个表达式,用下面的命令来计算它的值;
$((expression))
example1
编写一个shell脚本用于计算呼叫中心未应答的询问的数量。该脚本应该接受一天那所报告的询问的总数和应答的询问的数量,以便计算未应答的询问的数量。
所有未应答的询问总数=所有询问的总数-应答的询问的数量
<!--[if!supportLists]-->※<!--[endif]-->※※※※※※※※※※※※※※※※※※※※※※※
条件执行
test和[]
求值表达式,并返回true(0)或false()
数值测试:
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真
if构造
Linuxshell提供了循环和判定的构造,可以在shell脚本中使用
算术测试
结合if构造,它可以用于测试变量的数字值
串测试
test命令也可以用于字符串
=等于则为真
!=不相等则为真
-z字符串长度为零则为真
-n字符串长度不为零则为真
文件测试
test命令也可以用于检查文件的状态
-e文件存在则为真
-r文件存在并且可读则为真
-w文件存在并且可写则为真
-x文件存在并且可执行则为真
-s文件存在并且至少有一个字符则为真
-d文件存在并且为目录则为真
-f文件存在并且为普通文件则为真
-c文件存在并且为字符型文件则为真
-b文件存在并且为块特殊文件则为真
-a并且-o或者!非
exit命令
用于终止shell脚本的执行并返回到$提示符下
case。。。esac
shell脚本中使用的这个构造依据变量的值而执行一组特定指令
当变量的值和其中的一个值匹配的时候,就执行写在该值下的一组命令。
example3
迭代
while构造
while<条件>
do
<命令(s)>
done
只有条件为真的时候,才能执行do与done之间的命令
until构造
until循环构造的求值模式于while循环相反
until循环将继续执行直到求值的条件为真的时候
for构造
forvariable_namein<list_of_values>
do
…
done
for循环取一列值作为输入并对循环中每个值执行循环
break和contineu命令
同其他语言中的用法
example4
控制进程的执行
请求后台处理
用于请求后台进程的符号是(&)
$wctempfile&
[1]2082
$vinewfile
检查后台进程
ps(进程状态)命令为每个当前的活动的每个进程产生一行入口。
终止后台进程
可用kill,如下所示
kill278
查看完成一个命令所花的时间
你可以使用time命令来查看一个命令从开始到结束所花的时间
timefine/etc–name“passwd”2>/dev/null/dev/null表明忽略错误信息。
管道的介绍
垂直条(|)是管道字符
它只是shell:“|”前面命令的输出作为“|”之后命令的输入发送
ls–l|more
用管道组合命令,功能强大
㈣ 请用Shell脚本编写程序,将100以内能被3或7整除的数的和显示出来.
#!/bin/bash
sum=0
foriin`seq1100`;do
a=$[$i%3]
b=$[$i%7]
if[$a-eq0]||[$b-eq0];then
sum=$[$sum+$i]
fi
done
echo$sum
㈤ 编写shell的脚本实现1到100的相加,并输出如下格式 1+2+3+........+100=
COUNTER=1
SUM=0
printf "启银%d" $COUNTER
while [ $COUNTER -le 100 ]do
SUM='expr $COUNTER+$SUM'
printf "+%d" $COUNTER
COUNTER='expr $COUNTER+1'
done
printf "=%d\衡旁坦咐桐n" $SUM
㈥ 编写Shell脚本文件,在当前目录下建立100个目录,并给出执行该文件的步骤
用bash不用写脚本,一行命令就成
printf 'user%01d\n' {1..100} | xargs mkdir
nc10@your-5554c55be4 ~
$ cd tmp
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ pwd
/home/nc10/tmp
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ printf 'user%01d\n' {1..100} | xargs mkdir
nc10@your-5554c55be4 ~/tmp
$ ls
user1/ user20/ user32/ user44/ user56/ user68/ user8/ user91/
user10/ user21/ user33/ user45/ user57/ user69/ user80/ user92/
user100/ user22/ user34/ user46/ user58/ user7/ user81/ user93/
user11/ user23/ user35/ user47/ user59/ user70/ user82/ user94/
user12/ user24/ user36/ user48/ user6/ user71/ user83/ user95/
user13/ user25/ user37/ user49/ user60/ user72/ user84/ user96/
user14/ user26/ user38/ user5/ user61/ user73/ user85/ user97/
user15/ user27/ user39/ user50/ user62/ user74/ user86/ user98/
user16/ user28/ user4/ user51/ user63/ user75/ user87/ user99/
user17/ user29/ user40/ user52/ user64/ user76/ user88/
user18/ user3/ user41/ user53/ user65/ user77/ user89/
user19/ user30/ user42/ user54/ user66/ user78/ user9/
user2/ user31/ user43/ user55/ user67/ user79/ user90/
nc10@your-5554c55be4 ~/tmp
$
或者用seq
mkdir $(seq -f 'user%01g' 1 100)
nc10@your-5554c55be4 ~/tmp
$ ls
nc10@your-5554c55be4 ~/tmp
$ mkdir $(seq -f 'user%01g' 1 100)
nc10@your-5554c55be4 ~/tmp
$ ls
user1/ user20/ user32/ user44/ user56/ user68/ user8/ user91/
user10/ user21/ user33/ user45/ user57/ user69/ user80/ user92/
user100/ user22/ user34/ user46/ user58/ user7/ user81/ user93/
user11/ user23/ user35/ user47/ user59/ user70/ user82/ user94/
user12/ user24/ user36/ user48/ user6/ user71/ user83/ user95/
user13/ user25/ user37/ user49/ user60/ user72/ user84/ user96/
user14/ user26/ user38/ user5/ user61/ user73/ user85/ user97/
user15/ user27/ user39/ user50/ user62/ user74/ user86/ user98/
user16/ user28/ user4/ user51/ user63/ user75/ user87/ user99/
user17/ user29/ user40/ user52/ user64/ user76/ user88/
user18/ user3/ user41/ user53/ user65/ user77/ user89/
user19/ user30/ user42/ user54/ user66/ user78/ user9/
user2/ user31/ user43/ user55/ user67/ user79/ user90/
nc10@your-5554c55be4 ~/tmp
$
㈦ 学透shell 带你写常用的100个 shell 脚本(一)定时删除过期文件
本文已参与“新人创作礼”活动,一起开启掘金创作之路。
需要清理服务器中过期的文件、日志、临时压缩未清理的垃圾文件、过久的备份文件,手动删除过于繁琐,可以通过此脚本进行删除,如有不同场景,适量修改即可
目标:删除 /home/logs/下超过30天的日志文件,文件名称为xxxx-service-2022-06-18-20.out
如果只需单次清理,只需要执行删除命令即可
添加定时任务,设置每个月1号晚上4点10分执行脚本.当然你也可以根据你自己的需求去整
OK ,此次结束 🔚。
㈧ 编写shell脚本sum求1-100累加和
sum=0
for((i=1;i<=100;i++));do
sum=$((i+sum))
done
echo$sum
很多很多者老种方法,可首灶升辩毕以网上搜一下贴
㈨ shell程序实现1-2+3-4……-100求和
flag=1;
sum=0;
for((i=1;i<=100;i++));do
add=`expr $flag * $i
sum=`expr $sum + $add`
flag=`expr 0 - $flag`
done
echo $sum
或:
#include<iostream>
using namespace std;
int main()
{
int sum=0;
int i;
for(i=1;i<=100;i++)
sum=sum+i;
cout<<"1+2+3+...+100="<<sum<<endl;
}
(9)shell脚本经典实例100扩展阅读:
本示例使用Shell函数来完成一个用户指定的应用程序。将第二个参数值设成1,可让该模中盯培埋程序以正常大小的窗口完成,并且拥有焦点。 Dim RetValRetVal = Shell("C:WINDOWSCALC.EXE", 1) ' 完成Calculator。
使用shell脚本调用linux中当前时间,并记录在log文件中,10秒后再次记录时间。
date>>/tmp/data.log
sleep10
date>>/tmp/data.log
参考旦和资料来源:网络-shell
㈩ 分享70个经典的 Shell 脚本面试题与答案
1) 如何向脚本传递参数 ?
./script argument
2) 如何在脚本中使用参数 ?
第一个参数 : $1 ,第二个参数 : $2
cp $1 $2
3) 如何计算传递进来的参数 ?
$#
4) 如何在脚本中获取脚本名称 ?
$0
5) 如何检查之前的命令是否运行成功 ?
$?
6) 如何获取文件的最后一行 ?
tail-1
7) 如何获取文件的第一行 ?
head-1
8) 如何获取一个文件每一行的第三个元素 ?
awk'{print $3}'
9) 假如文件中每行第一个元素是 FIND,如何获取第二个元素
awk'{ if ($1 == "FIND") print $2}'
10) 如何调试 bash 脚本
将 -xv 参数加到 #!/bin/bash 后
例子:
#!/bin/bash –xv
11) 举例如何写一个函数 ?
12) 如何向连接两个字符串 ?
输出
HelloWorld
13) 如何进行两个整数相加 ?
14) 如何检查文件系统中是否存在某个文件 ?
15) 写出 shell 脚本中所有循环语法 ?
for 循环 :
while 循环 :
until 循环 :
16) 每个脚本开始的 #!/bin/sh 或 #!/bin/bash 表示什么意思 ?
这一行说明要使用的 shell 。 #!/bin/bash 表示脚本使用 /bin/bash 。对于 python 脚本,就是 #!/usr/bin/python 。
17) 如何获取文本文件的第 10 行 ?
head -10 file|tail -1
18) bash 脚本文件的第一个符号是什么
#
19) 命令: [ -z "" ] && echo 0 || echo 1 的输出是什么
0
20) 命令 “export” 有什么用 ?
使变量在子 shell 中可用。
21) 如何在后台运行脚本 ?
nohup command&
大部分时间我们可能是远程使用Linux,我碰到过由于网络断线使得在后台运行的 command & 没了...
22) "chmod 500 script" 做什么 ?
使脚本所有者拥有可执行权限。
23) ">" 做什么 ?
重定向输出流到文件或另一个流。
24) & 和 && 有什么区别
25) 什么时候要在 [ condition ] 之前使用 “if” ?
当条件满足时需要运行多条命令的时候。
26) 命令: name=John && echo "My name is $name" 的输出是什么
My name is John
27) bash shell 脚本中哪个符号用于注释 ?
#
28) 命令: echo ${new:-variable} 的输出是什么
variable
29) ' 和 " 引号有什么区别 ?
30) 如何在脚本文件中重定向标准输出和标准错误流到 log.txt 文件 ?
在脚本文件中添加 "exec >log.txt 2>&1" 命令。
31) 如何只用 echo 命令获取字符串变量的一部分 ?
例子:
32) 如果给定字符串 variable="User:123:321:/home/dir" ,如何只用 echo 命令获取 home_dir ?
echo ${variable#*:*:*:}
或
echo ${variable##*:}
33) 如何从上面的字符串中获取 “User” ?
echo ${variable%:*:*:*}
或
echo ${variable%%:*}
34) 如何使用 awk 列出 UID 小于 100 的用户 ?
awk -F: '$3<100' /etc/passwd
35) 写程序为用户计算主组数目并显示次数和组名
36) 如何在 bash shell 中更改标准的域分隔符为 ":" ?
IFS=":"
37) 如何获取变量长度 ?
${#variable}
38) 如何打印变量的最后 5 个字符 ?
echo ${variable: -5}
39) ${variable:-10} 和 ${variable: -10} 有什么区别?
40) 如何只用 echo 命令替换字符串的一部分 ?
echo ${variable//pattern/replacement}
41) 哪个命令将命令替换为大写 ?
tr '[:lower:]' '[:upper:]'
42) 如何计算本地用户数目 ?
wc -l /etc/passwd|cut -d" " -f1 或者 cat /etc/passwd|wc -l
43) 不用 wc 命令如何计算字符串中的单词数目 ?
44) "export $variable" 或 "export variable" 哪个正确 ?
export variable
45) 如何列出第二个字母是 a 或 b 的文件 ?
ls -d ?[ab]*
46) 如何将整数 a 加到 b 并赋值给 c ?
47) 如何去除字符串中的所有空格 ?
echo $string|tr -d " "
48) 重写这个命令,将输出变量转换为复数: item="car"; echo "I like $item" ?
item="car"; echo "I like ${item}s"
49) 写出输出数字 0 到 100 中 3 的倍数(0 3 6 9 …)的命令 ?
for i in {0..100..3}; do echo $i; done
或
for (( i=0; i<=100; i=i+3 )); do echo "Welcome $i times"; done
50) 如何打印传递给脚本的所有参数 ?
echo $*
或
echo $@
51) [ $a == $b ] 和 [ $a -eq $b ] 有什么区别
52) = 和 == 有什么区别
53) 写出测试 $a 是否大于 12 的命令 ?
[ $a -gt 12 ]
54) 写出测试 $b 是否小于等于 12 的命令 ?
[ $b -le 12 ]
55) 如何检查字符串是否以字母 "abc" 开头 ?
[[ $string == abc* ]]
56) [[ $string == abc* ]] 和 [[ $string == "abc*" ]] 有什么区别
57) 如何列出以 ab 或 xy 开头的用户名 ?
egrep "^ab|^xy" /etc/passwd|cut -d: -f1
58) bash 中 $! 表示什么意思 ?
后台最近执行命令的 PID.
59) $? 表示什么意思 ?
前台最近命令的结束状态。
60) 如何输出当前 shell 的 PID ?
echo $$
61) 如何获取传递给脚本的参数数目 ?
echo $#
62) $* 和 $@ 有什么区别
63) 如何在 bash 中定义数组 ?
array=("Hi" "my" "name" "is")
64) 如何打印数组的第一个元素 ?
echo ${array[0]}
65) 如何打印数组的所有元素 ?
echo ${array[@]}
66) 如何输出所有数组索引 ?
echo ${!array[@]}
67) 如何移除数组中索引为 2 的元素 ?
unset array[2]
68) 如何在数组中添加 id 为 333 的元素 ?
array[333]="New_element"
69) shell 脚本如何获取输入的值 ?
a) 通过参数
./script param1 param2
b) 通过 read 命令
read -p "Destination backup Server : " desthost
70) 在脚本中如何使用 "expect" ?