对于linuxshell三种自动交互方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍shell实现自动交互,并为您提供关于Linux-常用shell简介及shell基本操作、Linux=有没
对于linux shell 三种自动交互 方法感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍shell实现自动交互,并为您提供关于Linux - 常用 shell 简介及 shell 基本操作、Linux =有没有类似“Java Shell”而不是其他Linux shell?、Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s、linux Shell 命令行-03-array Shell 数组的有用信息。
本文目录一览:- linux shell 三种自动交互 方法(shell实现自动交互)
- Linux - 常用 shell 简介及 shell 基本操作
- Linux =有没有类似“Java Shell”而不是其他Linux shell?
- Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s
- linux Shell 命令行-03-array Shell 数组
linux shell 三种自动交互 方法(shell实现自动交互)
方法一
自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考LINUX与UNIX SHELL编程指南 chapt 5.7):"command << delimiter 从标准输入中读入,直至遇到delimiter分界符。"
重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。
对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:
#!/bin/bash
ftp -i -n 192.168.167.187 << EOF
user hzc 123456
pwd
cd test
pwd
close
bye
EOF
测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。
方法二
需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。
这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。
#!/bin/bash
(echo "curpassword"
sleep 1
echo "newpassword"
sleep 1
echo "newpassword")|passwd
测试通过,运行这个脚本,直接把当前用户的curpassword改成newpassword。
方法三
需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。
这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:
#!/usr/bin/expect
spawn su root
expect "password: "
send "123456\r"
expect eof
exit
测试通过,运行这个脚本,直接从当前用户登录到root用户。
总结
方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。
方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。
方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。
Linux - 常用 shell 简介及 shell 基本操作
1. 查询 shell 环境变量,切换 shell 种类
表明目前使用的 shell 种类是 bash。
要想改变 shell 种类,在终端输入想要运行的 shell 名称即可。在切换 shell 种类的过程中,可能会操作失败,这是因为 ubuntu 没有自带安装想要切换的 shell 种类。
2.shell 命令的基本格式
shell 的命令格式如下:
command -options [argument]
command:shell 命令的名称。
-options: 选项,同一个命令可能有很多不同的选项,用来完成不同的具体功能。
[argument]: 参数,作为 shell 命令的输入,有的 shell 命令可以没有参数,或者不带参数运行。
例如:
ls //查看当前目录下的文件及文件夹
ls -l //查看当前目录下的文件及文件夹的详细信息
ls -l /home //查看/home目录下的文件及文件夹的详细信息
3.shell 的常用特殊符号
(1)“*”
是一个通用符号,可以表示任意一个字符(包括空字符)或多个字符组成的字符串。例如
ls -l /bin/e* //查看/bin/目录下的所有以e开头的文件及文件夹的详细信息
(2)“?”
功能类似于 “*” 符号,但是只能表示单个字符,不能表示由多个字符组成的字符串。例如
ls -l /bin/e? //查看/bin/目录下的所有以e开头的长度为2的文件及文件夹的详细信息
(3)“[ ]”
指定范围,用来指定被显示的内容的范围。例如,在 /home/leon 目录下新建一个文件夹,名为 test, 在 test 文件夹下新建 5 个文件夹,名为 a、b、c、d、e。
cd /home/leon/test //进入到该目录下cd /home/leon/test
ls [a-c] //仅查看名为a~c的文件及文件夹
(4)“!”
排除符号,用来指定被屏蔽显示内容的部分。需要与 “[]” 符号联合使用。例如
ls [a-c] //仅查看名为a~c的文件及文件夹
(5)“;”
分割符号,用于在一行输入多个命令时,分隔各个命令。例如
ls;ls -l //查看当前目录下的文件及文件夹,然后查看他们的详细信息
(6)“`”
命令替代符,这个符号总是成对出现,他们包含的内容在 shell 中表示一条命令,并且会被执行。例如
echo `ls -l` //将命令“ls -l”的结果显示出来
echo ''ls -l'' //这里是单引号,表示显示“ls-l”这个字符串
(7)“#”
注释符号,以 “#” 开头的一行被当作是注释处理,不会被执行。
ls -l //查看当前目录下的文件和文件夹的详细信息
# ls -l //添加上“#”号,该命令被当作注释,不会被执行
4. 自动补全功能
输入 “who”, 然后按住 TAB 键,系统将发出警报声,此时可以继续输入,也可以在此按下 TAB 键,系统将列出说有 who 开头的命令。
5. 按方向键上和下可以选择曾经输入过的历史命令。
6.shell 别名机制
需要用到 “alias” 命令
mynet //输入mynet,Linux中并无此命令
ifconfig //ifconfig命令可以查看网络情况
alias mynet=ifconfig //给ifconfig起个别名mynet
mynet //mynet就可以生效了
Linux =有没有类似“Java Shell”而不是其他Linux shell?
解决方法
Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s
linux Shell 命令行-03-array Shell 数组
拓展阅读
linux Shell 命令行-00-intro 入门介绍
linux Shell 命令行-02-var 变量
linux Shell 命令行-03-array 数组
linux Shell 命令行-04-operator 操作符
linux Shell 命令行-05-test 验证是否符合条件
linux Shell 命令行-06-flow control 流程控制
linux Shell 命令行-07-func 函数
linux Shell 命令行-08-file include 文件包含
linux Shell 命令行-09-redirect 重定向
定义
Shell 仅支持单维数组。
array=(值1 值2 ... 值n)
- array.sh
#!/bin/sh
# 数组演示
array=(a b "c" d)
# 另一种定义数组的方式
array_two[0]=a
array_two[1]=b
array_two[2]="c"
array_two[3]=d
读取
您可以这样从数组中读取:
${array_name[index]}
- read_array.sh
#!/bin/sh
# 从数组中读取
array=(a b c "d")
echo "第一个元素是 ${array[0]}"
echo "第二个元素是 ${array[1]}"
echo "第三个元素是 ${array[2]}"
echo "最后一个元素是 ${array[-1]}"
- 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x read_array.sh
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./read_array.sh
第一个元素是 a
第二个元素是 b
第三个元素是 c
最后一个元素是 d
读取所有元素
我们可以使用 *
或 @
来获取数组中的所有元素。
- read_all_array.sh
#!/bin/sh
# 读取数组中的所有元素
array=(a b c d)
echo "数组中的所有元素:${array[*]}"
echo "数组中的所有元素:${array[@]}"
- 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x read_all_array.sh
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./read_all_array.sh
数组中的所有元素:a b c d
数组中的所有元素:a b c d
数组长度
我们可以使用 ${#array[*]}
或 ${#array[@]}
来获取数组的大小。
- array_length.sh
!#/bin/sh
# 数组长度
array=(a b c d E)
echo "数组的大小为:${#array[*]}"
echo "数组的大小为:${#array[@]}"
- 运行
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# chmod +x array_length.sh
root@iZuf60ahcky4k4nfv470juZ:~/code/shell# ./array_length.sh
数组的大小为:5
数组的大小为:5
参考资料
https://www.runoob.com/linux/linux-shell.html
本文由博客一文多发平台 OpenWrite 发布!
今天关于linux shell 三种自动交互 方法和shell实现自动交互的介绍到此结束,谢谢您的阅读,有关Linux - 常用 shell 简介及 shell 基本操作、Linux =有没有类似“Java Shell”而不是其他Linux shell?、Linux PHP53升级PHP5533 linux php升级5.5 php5.2 for linux linux libphp5.s、linux Shell 命令行-03-array Shell 数组等更多相关知识的信息可以在本站进行查询。
本文标签: