多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] * exit被用来结束一个脚本, 就像在C语言中一样. 它也返回一个值, 并且这个值会传递给脚本的父进程, 父进程会使用这个值做下一步的处理. ### 1. 远程执行命令 * * * * * 1. `ssh ssh -t -p $port $user@$ip 'cmd'` -t:提供一个远程服务器的虚拟tty终端 ~~~ port #远程主机端口 user #远程登录用户 ip #远程登录IP cmd # Linux命令 ~~~ 2. expect 交互 ~~~ #!/usr/bin/expect -f set ipaddress [lindex $argv 0] set port [lindex $argv 1] set username [lindex $argv 2] set passwd [lindex $argv 3] set cmd [lindex\ $argv 4] set timeout 600 spawn ssh $ipaddress -p$port -l$username expect { “yes/no” { send “yes\r”; exp_continue } “assword:” { send “$passwd\r” } } expect -re “~]($|#)” send “$cmd \r” expect -re “~($|#)” send “$cmd \r” expect -re “~]($|#)” send “exit\r” ~~~ ./remote-cp.sh 192.168.1.158 22 aixin aixin "`ifconfig` " * * * * * ### 2.获取命令输出数据 ~~~ set `cmd` #保存了命令的输出数据(命令输出一般以空格分割) echo $2 # 打印第二个位置的输出 ~~~ ![](https://box.kancloud.cn/8dc0f9cb4af2e0195c02dc5000b29e0b_512x187.png) ### 3.变量替换 ~~~ #!/bin/bash username0= echo "username0 has been declared, but is set to null." echo "username0 = ${username0:-`whoami`}" # “-”相当于“=” ~~~ 输出 ![](https://box.kancloud.cn/17e3450f954723e171497c12dee348da_505x65.png) * * * * * ### 4.控制结构 #### 4.1 if else if condition then : # 什么都不做,引出分支. else take-some-action fi * * * * * ### 5.测试符 #### 5.1文件测试符 ~~~ * -e 文件存在 * -a 文件存在,这个选项的效果与-e相同. 但是它已经被"弃用"了, 并且不鼓励使用. * -f 如果文件存在且可读为真 * -s 文件大小不为零 * -d 表示这否是一个目录 * -z 判断变量是否没有值,没有值为真返回0 * -b 表示这是一个块设备(软盘, 光驱, 等等.) * -c 表示这是一个字符设备(键盘, modem, 声卡, 等等.) * -p 这个文件是一个管道 * -h 这是一个符号链接,当文件存在且是一个软链接时,判断的结果是True * -L 这是一个符号链接 * -S 表示这是一个socket * -t 文件(描述符)被关联到一个终端设备上,这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是否来自于一个终端. * -r 文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限) * -w 文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限) * -x 文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行权限) * -g set-group-id(sgid)标记被设置到文件或目录上,如果目录具有sgid标记的话, 那么在这个目录下所创建的文件将属于拥有这个目录的用户组, 而不必是创建这个文件的用户组. 这个特性对于在一个工作组中共享目录非常有用. * -u set-user-id (suid)标记被设置到文件上,如果一个root用户所拥有的二进制可执行文件设置了set-user-id标记位的话, 那么普通用户也会以root权限来运行这个文件. [1] 这对于需要访问系统硬件的执行程序(比如pppd和cdrecord)非常有用. 如果没有suid标志的话, 这些二进制执行程序是不能够被非root用户调用的.对于设置了suid标志的文件, 在它的权限列中将会以s表示.其实这个权限在最初说文件权限的文章中已经说过了,比较特殊的一种权限 * -n 字符串不为空,且长度大于零 * -k 设置粘贴位,对于"粘贴位"的一般了解, save-text-mode标志是一个文件权限的特殊类型. 如果文件设置了这个标志, 那么这个文件将会被保存到缓存中, 这样可以提高访问速度. [2] 粘贴位如果设置在目录中, 那么它将限制写权限. 对于设置了粘贴位的文件或目录, 在它们的权限标记列中将会显示t. * -O 判断你是否是文件的拥有者 * -G 文件的group-id是否与你的相同 * -N 从文件上一次被读取到现在为止, 文件是否被修改过 * f1 -nt f2 文件f1比文件f2新 * f1 -ot f2 文件f1比文件f2旧 * f1 -ef f2 文件f1和文件f2是相同文件的硬链接 * ! "非" -- 反转上边所有测试的结果(如果没给出条件, 那么返回真). ~~~ ~~~ $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定的Flag一览 $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 $# 添加到Shell的参数个数 $0 Shell本身的文件名 $1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 ~~~ * *表示配置任意字符 * ?表示匹配任意单个字符 * [...]用来匹配任意字符 * [!...]用来匹配非后面这个字符 ~~~ [0-9]匹配0到9任意单个数字 [!0-9]匹配不是0到9任意单个数字 ~~~ ### 6.set -o shell特性开启 ~~~ set -x # 脚本开启调试 unset # 于删除已定义的shell变量(包括环境变量)和shell函数。 ~~~ ![](https://box.kancloud.cn/2ece7a2589a1126a6f27f9be176f1837_954x607.png) ![](https://box.kancloud.cn/ee4c9b90bcac69faf5b8eb304e57480c_847x869.png) ### 7. 读取脚本路径 > readlink命令用来获取一个软链接指向的目的路径。 当一个软链接指向的是一个另外的软链接,而另外一个软链接又指向其他的目标。 这时可以使用-f选项直接获取最终的非软链接的目标。 ~~~ #/bin/bash path=$(dirname $(readlink -f "$0")) echo $path ~~~ ## 8. 大小比较 ~~~ -eq //等于 -ne //不等于 -gt //大于 -lt //小于 ge //大于等于 le //小于等于 ~~~