目录
管道 “|”
管道是将一个进程(可以理解为命令)的标准输出数据连接到另一个进程的标准输入。
标准输入(stdin)是文件描述符 0
标准输出(stdout)是文件描述符 1
标准错误(stderr)是文件描述符 2
什么场景下可以使用管道?
1、管道左边的命令可以将执行的结果输出到标准输出。
2、右边的命令执行时,默认可以从标准输入读取数据。
结论:条件1 | 条件2
案例:
echo "aaa" ;ls /root #回车后命令结果可以输出到标准输出进行数据的显示。
cat、grep、wc #回车后命令可以默认从标准输入中读取数据。
ls /root | cat ; ls /root | wc -l
不能使用管道 echo “/root” | ls #echo可以将结果输出到标准输出,但是ls不能从标准输入读取数据。
输出重定向
覆盖重定向 : >
格式 : 命令 > 文件
作用:将标准输出内容重定向到文件,文件中若有内容会覆盖。
echo 123 > abc.txt
echo 456 > abc.txt
echo 789 > abc.txt
结果:
[root@nsd2403 ~]# cat abc.txt
789
追加重定向:>>
格式 : 命令 >> 文件
作用:将标准输出内容重定向到文件,向文件某位追加内容,原有内容不会覆盖。
echo 123 >> abc.txt
echo 456 >> abc.txt
echo 789 >> abc.txt
结果:
[root@nsd2403 ~]# cat abc.txt
123
456
789
总结:
符号 | 含义与用法 |
---|---|
> | 将标准输出内容重定向到文件,文件中若有内容会覆盖。 |
>> | 将标准输出内容重定向到文件,向文件某位追加内容,原有内容不会覆盖 |
输入重定向
<
格式: 命令 < 文件 条件:命令默认可以从标准输入读取。
条件:命令默认可以从标准输入读取数据。
作用:将文件内容重定向到标准输入。
非交互修改密码可以使用管道
echo 123456 | passwd --stdin user1
是否可以使用输入重定向?
[root@nsd2403 ~]# cat p.txt
123456
passwd --stdin user1 < p.txt
答案:可以,因为passwd --stdin 会从标准输入读取数据,而 < 正是将文件中的数据重定向到了标准输入。
<<
格式: 命令 << xxx
.....
xxx
条件:命令默认可以从标准输入读取数据。
作用:
<<
符号引入了一种特殊的文本块,称为Here Document。Here Document 允许我们在命令行中嵌入多行文本块作为输入,然后重定向到标准输入。EOF 标识开头和结尾,可以替换其它字符串,结尾的EOF前面必须顶格写,不能有空格。
grep 111 << EOF
11111111
222222222
3333333
EOF
<<<
格式:命令 <<< 字符串
条件:命令默认可以从标准输入读取数据。
作用:将字符串重定向到标准输入。
grep 11111 <<< "1111111,333333434545ges"
Shell脚本执行方式
- . test.sh
- source test.sh
- ./test.sh
- bash test.sh
相同点和不同点
. test.sh 等于 source test.sh
在当前进程中执行test.sh脚本时,不会创建子进程,只会在当前进程环境执行,脚本中的全局变量及函数可以在当前shell进程中共享。
[root@host12 ~]# cat test.sh
a=1
[root@host12 ~]# . test.sh
[root@host12 ~]# echo $a
1
./test.sh 等于 bash test.sh
在当前进程中创建新的子进程,在子进程中执行脚本内容,父进程和子进程中的变量不共享
[root@host12 ~]# cat test.sh
echo test:$e
[root@host12 ~]# e=23
[root@nsd2403 ansible]# ./test.sh
test:
[root@nsd2403 ansible]# bash test.sh
test:
Shell变量作用范围
- 脚本中的变量-局部变量
- 脚本中的变量-全局变量
- 进程间的变量(环境变量)
- 脚本的变量-局部变量
在函数内部使用local关键字修饰,只能在函数内部使用,出了函数范围就会被系统回收。
#!/bin/bash
test(){
local a=1
echo test:$a
}
test
echo now:$a
运行结果:
[root@nsd2403 ansible]# ./test.sh
test:1
now:
[root@nsd2403 ansible]#
- 脚本中的变量-全局变量(进程内的变量)
不使用任何关键字修饰,默认声明的变量是脚本中的全局变量,作用范围是当前进程内有效
#!/bin/bash
test(){
a=2
echo test:$a
}
test
echo now:$a
运行结果:
[root@nsd2403 ansible]# ./test.sh
test:2
now:2
- 进程间的变量(环境变量)
使用export关键字修饰,能够被子进程继承,继承关系是单向的:父--->子
永久设置环境变量:
对所有用户都永久生效的设置:/etc/profile
对特定用户生效的配置:~.bash_profile
[root@nsd2403 ansible]# cat test.sh
#!/bin/bash
echo test:$c
[root@nsd2403 ansible]# export c=12
[root@nsd2403 ansible]# bash test.sh
test:12
[root@nsd2403 ansible]#
文件权限中的 . 是什么意思?
[root@nsd2403 ansible]# ls -l
总用量 28
-rw-r--r--. 1 root root 63 4月 28 09:32 ansible.cfg
drwxr-xr-x. 3 root root 17 4月 26 15:53 db1
-rw-r--r--. 1 root root 69 4月 28 09:32 inventory.ini
-rw-r--r--. 1 root root 142 4月 26 19:51 inventory.yaml
-rw-r--r--. 1 root root 186 4月 26 18:57 playbook.yaml
-rwxr-xr-x. 1 zhangsan zhangsan 27 4月 28 20:28 test.sh
-rw-r--r--. 1 root root 737 4月 28 18:02 test.yml
-rw-r--r--. 1 root root 644 4月 28 18:10 utest.yml
drwxr-xr-x. 3 root root 17 4月 26 15:53 web1
drwxr-xr-x. 3 root root 17 4月 26 15:53 web2
这个点表示的是存在“SELinux的安全标签”,将selinux设置为disabled,重启后,再创建文件 点就没有了。
函数的返回值
执行一个函数时,函数的返回值是一个0~255的正整数。
当函数中没有return关键字时,或者return 不跟参数时,函数的返回值是函数中最后一条命令的返回状态值。
当函数中有return关键字,并携带参数时,函数的返回值是其后的数字。
#!/bin/bahs
test(){
echo "ok"
return 2;
}
test
echo result=$?
输出内容:
ok
result=2
执行下面shell,屏幕打印出什么内容?
#!/bin/bahs
test(){
echo "ok"
echo "ok1"
}
a=$(test)
echo result=$?
echo result1=$a
输出内容为:
result=0
result1=ok ok1
结论:函数的返回值是一个0-255的整数,可以使用$?变量获取
$(command)
是命令替换的一种形式(另一种是使用反引号command
,但因为反引号容易与单引号混淆,现在更推荐使用$()
)。这种方法执行括号内的命令,并将该命令的标准输出内容替换到当前命令行中。这意味着你可以将一个命令的输出作为另一个命令的参数或用于变量赋值等。