Shell脚本学习
1、介绍
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
第一个脚本
#!/bin/bash
echo "Hello World !"
运行Shell脚本
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2、变量
设置变量和使用变量
变量外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
#!/bin/bash
your_name="qinjx"
echo $your_name
echo ${your_name}
只读变量
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"
删除变量
变量被删除后不能在使用,改命令不能删除只读命令
unset variable_name
变量类型运行shell时,会同时存在三种变量:
- 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
Shell字符串
**字符串 **可以使用单引号,也可以使用双引号,也可以不使用引号
str1=’this is a string‘
str2="this is a string"
str3=this is a string
一般使用双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
获取字符串长度
string="abcd"
echo ${#string} #输出 4
Shell数组
array_name=(value0 value1 value2 value3)
3、Shell传递参数
脚本例子 test.sh
#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
传递参数实例
./test.sh 1 2 3
4、运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
**注意:**条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔关系运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
$0 这个脚本/程序的执行名字
$n 这个脚本/程序的第n个参数值,n=1…9
$* 这个脚本/程序的所有参数,此选项参数可超过9个。
$# 这个脚本/程序的参数个数
$$ 这个脚本/程序的PID(脚本运行的当前进程号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
@
跟
@ 跟
@跟*类似,但是可以当作数组用
5、脚本示例
Shell 准备ip数据调用Expect脚本
#!/bin/bash
funcInstall(){
./ssh-sun.exp $1 | tee -a test.log
}
int=6
while(($int<=25))
do
ip="192.168.1.$int"
echo $ip
funcInstall $ip $int
let "int ++"
done
使用Expect查找用户 ssh-sun.exp
#!/usr/bin/expect -f
set targetIP [lindex $argv 0]
spawn ssh root@$targetIP "cat /etc/passwd | grep sunrise"
expect {
"(yes/no)?" {
send "yes\r"
expect "Password: " {
send "xxx\r"
}
}
"Password: " {
send "xxx\r"
}
}
interact
scp.exp脚本
#!/usr/bin/expect -f
set targetIP [lindex $argv 0]
set targetPath [lindex $argv 1]
set localFiles [lindex $argv 2]
spawn scp -r $localFiles root@$targetIP:$targetPath
expect{
"(yes/no)?"{
send "yes\r"
expect "Password: " {
send "123456\r"
}
}
"Password: "{
send "123456\r"
}
}
ssh.exp
#!/usr/bin/expect -f
set targetIP [lindex $argv 0]
set commad [lindex $argv 1]
spawn ssh root@$targetIP "$commad"
expect{
"(yes/no)?"{
send "yes\r"
expect "Password: " {
send "123456\r"
}
}
"Password: "{
send "123456\r"
}
}
interact
useradd.exp
#!/usr/bin/expect -f
set targetIP [lindex $argv 0]
spawn ssh root@$targetIP "df"
expect{
"(yes/no)?"{
send "yes\r"
expect "Password: " {
send "123456\r"
}
}
"Password: "{
send "123456\r"
}
}
spawn ssh root@$targetIP "useradd sun"
expect {
"Password: "{
send "123456\r"
}
}
spawn ssh root@$targetIP "passwd sun"
expect {
"*: *"{send "123456\r";exp_continue}
"*:*" {send "123456\r";exp_continue}
}
usersudo.exp
#!/usr/bin/expect -f
set targetIP [lindex $argv 0]
spawn ssh root@$targetIP "chmod 777 etc/sudoers"
expect {
"Password: "{
send "123456\r"
}
}
spawn ssh root@$targetIP "echo 'sun ALL=(ALL) ALL' >> /etc/sudoers"
expect {
"Password: "{
send "123456\r"
}
}
spawn ssh root@$targetIP "chmod 440 etc/sudoers"
expect {
"Password: "{
send "123456\r"
}
}
expect eof