Shell学习记录2

1. 条件

三种方式

  • test 条件表达式
  • [ 条件表达式 ] 注意这种写法表达式两边一定都要有空格
  • [[ 条件表达式 ]] 要求同上

判断一个文件是否存在

mkdir a
#这里判断文件最好把路径写上
test -e ./a
#输出上一个命令返回的结果
echo $?
#输出0,这里0为真1为假
#test更多用法可以通过man test来查看
man test
TEST(1)                                                          User Commands                                                          TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

       --help display this help and exit

       --version
              output version information and exit

       An omitted EXPRESSION defaults to false.  Otherwise, EXPRESSION is true or false and sets exit status.  It is one of:

       ( EXPRESSION )
              EXPRESSION is true

       ! EXPRESSION
              EXPRESSION is false

       EXPRESSION1 -a EXPRESSION2
              both EXPRESSION1 and EXPRESSION2 are true

       EXPRESSION1 -o EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true

       -n STRING
              the length of STRING is nonzero

       STRING equivalent to -n STRING

       -z STRING
              the length of STRING is zero

也可以通过其他方式判断

[ -e ./a ]
echo $?
0
[[ -e ./a ]]
echo $?
0

[] 和 [[]] 的区别

#当我们定义一个变量为空值时
var=
[ $var = a ];echo $?
#报错
[ "$var" = "a" ];echo $?
#输出1
[[ $var = a ]];echo $?
#输出1

2. 流程控制

if基本结构

if 条件(参照1的三种写法); then
	command(命令)
fi(作为结束)
等价于
条件 && command

if…else结构

if 条件(参照1的三种写法); then
		command1(命令)
	else
		command2
fi(作为结束)
等价于
条件 && command1 || command2

if…elif…else结构

if 条件(参照1的三种写法); then
		command1(命令)
	elif 条件(参照1的三种写法; then
		command2
	else
		command3
fi(作为结束)

3. 循环

  1. for

    for带列表循环

    for var in {list}
    	do
    		command1
    		command2
    		........
    	done(作为结束)
    #或者
    for var in a b c
    	do
    		command1
    		command2
    		........
    	done(作为结束)
    

    简单实例

    for i in {1..5}
        do
            echo $i
    done
    #输出
    1
    2
    3
    4
    5
    

    关于集合的更多写法

    for i in {1..10..2}
    	do
            echo $i
    done
    #输出
    1
    3
    5
    7
    9
    for i in $(seq 5)
    	do
            echo $i
    done
    #输出
    1
    2
    3
    4
    5
    for i in $(seq -1 2)
    	do
            echo $i
    done
    #输出
    -1
    0
    1
    2
    for i in $(seq 5 -1 1)(中间为运算,只可加减)
    	do
            echo $i
    done
    #输出
    5
    4
    3
    2
    1
    

    在脚本里的一些用法(不带列表循环)

    vim a.sh
    #!/bin/bash
    for i
    	do
    		echo $hello
    	done
    
    ./a.sh
    #输出
    ./a.sh a
    #输出
    hello
    ./a.sh a 1
    #输出
    hello
    hello
    
    #等价于
    for i in "$@"
    	do
    		echo $hello
    	done
    

    类C方式的循环

    for ((expr1;epxr2;expr3))
    	do
    		command
    	done
    for ((i=1;i<=5;i++))
    	do
    		command
    	done
    
  2. while

    大部分while的用法都很相似

    while 条件(参照1的三种写法)
    	do
    		command
    	done
    
  3. until

    与while写法一致,但判断条件正好相反,条件为假则循环

    until 条件(参照1的三种写法)
    	do
    		command
    	done
    

4. 随机数

通过shell可以非常方便的生成随机数,直接调用系统变量RANDOM

#打印一个随机数
echo $RANDOM
#查看系统上一次生成的随机数
set|grep RANDOM

#产生0~1之间的随机数
echo $[$RANDOM%2]
#产生0~100之间的随机数
echo $[$RANDOM%100]
#产生50~100之间的随机数
echo $[$RANDOM%51+50]

5. 扩展

expect语言实现自动与服务器交互

例如

#!/bin/expect
set ip 10.0.0.1
set pass 123456
set timeout 5
#开启一个ssh
spawn ssh root@ip
#捕获内容自动输入密码
expect {
		#捕获结果出现yes/no的选项,自动输入yes加回车
		"(yes/no)?" { send "yes\r";exp_continue }
		"password:" {send "$pass\r"}
}
#交互
expect "#"
send "mkdir a\r"
send "touch b.sh\r"
send "exit\r"
expect eof
#程序结束

向expect脚本输入参数

#!/bin/expect
set ip [ lindex $argv 0 ]
set pass [ lindex $argv 1 ]
spawn ssh root@ip
#捕获内容自动输入密码
expect {
		#捕获结果出现yes/no的选项,自动输入yes加回车
		"(yes/no)?" { send "yes\r";exp_continue }
		"password:" {send "$pass\r"}
}
#交互

bash与expect的嵌套

#!/bin/bash
while read ip pass
do
	/bin/expect <<-END &>/dev/null
	spawn ssh root@$ip
	#捕获内容自动输入密码
	expect {
		#捕获结果出现yes/no的选项,自动输入yes加回车
		"(yes/no)?" { send "yes\r";exp_continue }
		"password:" {send "$pass\r"}
	}
	#交互
	END
echo "$ip服务器交互完成"
#从ip.txt读ip和pass
done < ip.txt

特别描述一下这个ip.txt,最后一行打完切记要加一个回车,不然会少读一行。

你可能感兴趣的:(Shell学习记录2)