echo -e 参数

若echo的字符串参数中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

1
2
3
4
5
6
7
8
9
10
\a 发出警告声; 
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

echo -e实例

1
2
3
str1="test1\n"
str2="test2"
echo $str1$str2

没有 -e 输出为

1
test1\ntest2

带 -e 输出为

1
2
test1
test2

关于/r与/n 以及 /r/n 的区别

来源

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

区别

\r就是回到行首,\n就是到下一行的,但是一般我们输出程序时,看不到明显的差别的

‘\r’是回车,’\n’是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。

对于cprintf和sprintf来说,你如果要换行的话,你要输入”\r\n”
而对于printf不说,换行只要”\r”就可以了。
一个是回车,一个是换行
ASCII码一个是10一个是13。

\r\n与\n是有区别的。
如果要通用的则是\r\n,因为有些编辑器它不认\n

echo 中 -c 命令

表示不换行,搭配 -e 使用

1
2
3
4
5
6
7
8
9
10
11
# 脚本内容
#!/bin/sh
echo -e "first line! \c" # -e 开启转义 \c 不换行
echo "second line!"

# 输出结果
first line!second line!

# 若没有 -c ,则输出结果为
first line!
second line!

文件检测命令

命令 作用
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true
-p file 检测文件是否是有名管道,如果是,则返回 true
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true
-r file 检测文件是否可读,如果是,则返回 true
-w file 检测文件是否可写,如果是,则返回 true
-x file 检测文件是否可执行,如果是,则返回 true
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true
-e file 检测文件(包括目录)是否存在,如果是,则返回 true
-S 判断某文件是否 socket。
-L 检测文件是否存在并且是一个符号链接。
## test 命令
test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
#### 数值与字符检测
参数与前面讲的运算符中关系运算符和字符串运算符一样,只是将表达式中外部的[] 换成了 test而已,如以下例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#! /bin/bash

num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi

# 输出结果为
两个数相等!

# 执行结果与将 test 换成 [ ] 后一样
num1=100
num2=100
if [ $[num1] -eq $[num2] ]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
# 输出结果为
两个数相等!

文件测试

参数为上一条文件检测命令的参数,直接上例子

1
2
3
4
5
6
7
8
#!/bin/bash

if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi

文件测试中还支持 -o 与 -a 来连接多个表达式。优先级为:!> -a > -o

let 命令

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

1
2
3
4
5
6
a=5
let "a++" # 这里的变量a加不加双引号都可以
echo $a

# 输出为
6

文件包含

简单说就是一个脚本中调用其他脚本,直接上例子:

1
2
3
4
# 脚本one.sh
#!/bin/bash

one="the is one in file one.sh"
1
2
3
4
# 脚本two.sh
#!/bin/bash

one="the is two in file two.sh"
1
2
3
4
5
6
7
8
9
# 脚本three.sh
#!/bin/bash

#以下包含文件的两种方法等效,推荐使用source关键字
. one.sh # 文件路径
source two.sh

echo $one
echo $two
1
2
3
# 执行脚本 three.sh,输出为
the is one in file one.sh
this is two in file two.sh

连接FTP

直接上例子

1
2
3
4
5
6
7
ftp -i -n ${HOST} <<!
user ${user} ${passwd}
lcd ${local_file}
cd ${tar_file}
mput *
quit
!
  • -i 在多个文件传输期间关闭交互提示
  • 使用 -n 选项连接ftp客户端以阻止ftp客户端立即登录.这样,ftp客户端就不要你输入一个用户名和密码了
  • HOST 是要连接的主机号
  • user user passwd 输入连接的主机用户名和相应密码
  • lcd 表示本地需要传输的文件路径
  • cd 表示目标主机需要接收文件的路径
  • mput 表示将本地文件路径下的所有文件都传输过去,如果只需要传输一个文件,则使用put命令
  • quit 退出本次连接