1、从FTP服务器下载文件

#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v << EOF # -n 自动登录
open 192.168.1.10 # ftp服务器
user admin password
binary # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
cd $dir
get "$file"
EOF

2、连续输入5个100以内的数字,统计和、最小和最大

#!/bin/bash
COUNT=
SUM=
MIN=
MAX=
while [ $COUNT -le ]; do
read -p "请输入100以内的整数:" INT
if [[ ! $INT =~ ^[-]+$ ]]; then
echo "输入必须是整数!"
exit
elif [[ $INT -gt ]]; then
echo "输入必须是100以内!"
exit
fi
SUM=$(($SUM+$INT))
[ $MIN -lt $INT ] && MIN=$INT
[ $MAX -gt $INT ] && MAX=$INT
let COUNT++
done
echo "SUM: $SUM"
echo "MIN: $MIN"
echo "MAX: $MAX"

3、将结果分别赋值给变量

应用场景:希望将执行结果或者位置参数赋值给变量,以便后续使用。

方法1:

for i in $(echo "4 5 6"); do
eval a$i=$i
done
echo $a4 $a5 $a6

方法2:将位置参数192.168.1.1{1,2}拆分为到每个变量

num=
for i in $(eval echo $*);do #eval将{,}分解为1
let num+=
eval node${num}="$i"
done
echo $node1 $node2 $node3
# bash a.sh 192.168.1.1{,}
192.168.1.11 192.168.1.12

方法3:

arr=(4 5 6)
INDEX1=$(echo ${arr[]})
INDEX2=$(echo ${arr[]})
INDEX3=$(echo ${arr[]})

4、批量修改文件名

# touch article_{..}.html
# ls
article_1.html article_2.html article_3.html
目的:把article改为bbs

方法1:

for file in $(ls *html); do
mv $file bbs_${file#*_}
# mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')
# mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
done

方法2:

for file in $(find . -maxdepth  -name "*html"); do
mv $file bbs_${file#*_}
done

方法3:

# rename article bbs *.html

5、统计当前目录中以.html结尾的文件总大

方法1:

# find . -name "*.html" -exec du -k {} \; |awk '{sum+=$1}END{print sum}'

方法2:

for size in $(ls -l *.html |awk '{print $5}'); do
sum=$(($sum+$size))
done
echo $sum

6、扫描主机端口状态

#!/bin/bash
HOST=$
PORT="22 25 80 8080"
for PORT in $PORT; do
if echo &>/dev/null > /dev/tcp/$HOST/$PORT; then
echo "$PORT open"
else
echo "$PORT close"
fi
done

7、Expect实现SSH免交互执行命令

Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等,需先安装expect软件包。

方法1:EOF标准输出作为expect标准输入

#!/bin/bash
USER=root
PASS=.com
IP=192.168.1.120
expect << EOF
set timeout
spawn ssh $USER@$IP
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$PASS\r"}
}
expect "$USER@*" {send "$1\r"}
expect "$USER@*" {send "exit\r"}
expect eof
EOF

方法2:

#!/bin/bash
USER=root
PASS=.com
IP=192.168.1.120
expect -c "
spawn ssh $USER@$IP
expect {
\"(yes/no)\" {send \"yes\r\"; exp_continue}
\"password:\" {send \"$PASS\r\"; exp_continue}
\"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}
}"

方法3:将expect脚本独立出来

登录脚本:

# cat login.exp
#!/usr/bin/expect
set ip [lindex $argv ]
set user [lindex $argv ]
set passwd [lindex $argv ]
set cmd [lindex $argv ]
if { $argc != } {
puts "Usage: expect login.exp ip user passwd"
exit
}
set timeout
spawn ssh $user@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$passwd\r"}
}
expect "$user@*" {send "$cmd\r"}
expect "$user@*" {send "exit\r"}
expect eof
执行命令脚本:写个循环可以批量操作多台服务器
#!/bin/bash
HOST_INFO=user_info.txt
for ip in $(awk '{print $1}' $HOST_INFO)
do
user=$(awk -v I="$ip" 'I==$1{print $2}' $HOST_INFO)
pass=$(awk -v I="$ip" 'I==$1{print $3}' $HOST_INFO)
expect login.exp $ip $user $pass $
done
Linux主机SSH连接信息:
# cat user_info.txt
192.168.1.120 root

8、批量修改服务器用户密码

Linux主机SSH连接信息:旧密码
# cat old_pass.txt
192.168.18.217 root
192.168.18.218 root
内容格式:IP User Password Port SSH远程修改密码脚本:新密码随机生成
#!/bin/bash
OLD_INFO=old_pass.txt
NEW_INFO=new_pass.txt
for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
NEW_PASS=$(mkpasswd -l ) # 随机密码
echo "$IP $USER $NEW_PASS $PORT" >> $NEW_INFO
expect -c "
spawn ssh -p$PORT $USER@$IP
set timeout
expect {
\"(yes/no)\" {send \"yes\r\";exp_continue}
\"password:\" {send \"$PASS\r\";exp_continue}
\"$USER@*\" {send \"echo \'$NEW_PASS\' |passwd --stdin $USER\r exit\r\";exp_continue}
}"
done 生成新密码文件:
# cat new_pass.txt
192.168.18.217 root n8wX3mU%
192.168.18.218 root c87;ZnnL

9、打印乘法口诀

方法1:

# awk 'BEGIN{for(n=0;n++<9;){for(i=0;i++<n;)printf i"x"n"="i*n" ";print ""}}'

方法2:

for ((i=;i<=;i++)); do
for ((j=;j<=i;j++)); do
result=$(($i*$j))
echo -n "$j*$i=$result "
done
echo
done

10、getopts工具完善脚本命令行参数

getopts是一个解析脚本选项参数的工具。

命令格式:getopts optstring name [arg]

初次使用你要注意这几点:

脚本位置参数会与optstring中的单个字母逐个匹配,如果匹配到就赋值给name,否则赋值name为问号;

optstring中单个字母是一个选项,如果字母后面加冒号,表示该选项后面带参数,参数值并会赋值给OPTARG变量;

optstring中第一个是冒号,表示屏蔽系统错误(test.sh: illegal option -- h);

允许把选项放一起,例如-ab

下面写一个打印文件指定行的简单例子,引导你思路:

#!/bin/bash
while getopts :f:n: option; do
case $option in
f)
FILE=$OPTARG
[ ! -f $FILE ] && echo "$FILE File not exist!" && exit
;;
n)
sed -n "${OPTARG}p" $FILE
;;
?)
echo "Usage: $0 -f -n "
echo "-f, --file specified file"
echo "-n, --line-number print specified line"
exit
;;
esac
done

11、打印三角形星星

#!/bin/bash
#for循环语句打印三角形
for ((i=; i<; i++));do
for ((n=; n>=i; n--));do
echo -n " "
done
for ((m=; m<=i; m++));do
echo -n "* "
done
echo
done

三角形空星

#!/bin/bash
i=
while [ $i -le ] ; do
j=
while [ $j -le $((-$i)) ] ; do
echo -n ' '
j=$(($j+))
done j=
while [ $j -le $((*$i-)) ] ; do
if [ $j -eq -o $j -eq $((*$i-)) -o $i -eq ] ; then
echo -n x
else
echo -n ' '
fi
j=$(($j+))
done
echo
i=$(($i+))
done
exit

shell脚本4的更多相关文章

  1. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  2. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  3. shell脚本规划化模板

    shell脚本规划化模板 Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的.脚本必须规范化,应该从以后几个 ...

  4. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  5. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  10. shell 脚本之循环使用 for while 详解

    任何一种编程语言中循环是比不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句. while 语句.文中主要以实际用例来说明 for while 都有哪些常见的使用方法和技巧. 一.f ...

随机推荐

  1. Mysql配置查询

    查看mysql数据库的线程数: show global status like 'Thread%'; 如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服 ...

  2. Linux下Discuz!7.2 LAMP环境搭建

    linux下Discuz LAMP环境搭建 1.需要的源代码 httpd-2.2.15.tar.gz          mysql-5.1.44.tar.gz     php-5.3.2.tar.gz ...

  3. 2017 去哪儿网 研发4.18(offer)

    去哪儿网一面(30分钟) 上来小哥哥先让自我介绍,然后开始问基础,说你计算机专业的,数据结构应该比较扎实吧,先写个快排.然后在我写的时候,小哥哥mac上敲敲打打,应该在看git,我简历上有留git的地 ...

  4. hiho #1038 : 01背包 (dp)

    #1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...

  5. sizeof运算符、虚函数、虚继承考点(待修改)

    参考: http://blog.csdn.net/wangyangkobe/article/details/5951248 下面的文章解释有错误,不要看.......... 记住几句话: 编译器为每个 ...

  6. 【杂题】[ARC070F] Honest Or Unkind【交互】

    Description 这是一道交互题 有A+B个人,编号从0~A+B-1,其中有A个人是诚实的,B个人是居心叵测的. 你想知道每个人是诚实的还是居心叵测的. 询问可以用二元组(i,j)表示,代表问编 ...

  7. win10下MYSQL 8.0.16的下载、安装以及配置

    win10系统MySQL 8.0的下载安装超详细教程 https://blog.csdn.net/qq_34444097/article/details/82315587 下载安装配置链接:https ...

  8. Upload-libs通关详解

    Uplo ad-labs—详解 1前端验证绕过 前端验证绕过可以直接用burp万能绕过前端JS脚本 方法先上传一张jpg Burp改包然后改后缀 上传成功 2Content-Type方式绕过 此绕过方 ...

  9. input(移动端iOS)输入内容时调用软件盘后页面底部留白问题

    iOS/input输入框调用软键盘底部留白 只需input输入框失去焦点时,让页面自动下移即可恢复 <input placeholder="请输入用户名" v-model=& ...

  10. Jdk1.7 与 jdk1.8的区别

    在jdk7的新特性方面主要有下面几方面的增强: 1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头. 所有整数int.short.long.byte都可以用二进制表示: byte aBy ...