美文网首页
shell 总结及思考

shell 总结及思考

作者: oasis_m | 来源:发表于2020-03-23 19:01 被阅读0次

声明:所有文章只作为学习笔记用,转载非原创
https://www.cnblogs.com/f-ck-need-u/p/7048359.html#auto_id_1

基础笔记

https://mp.weixin.qq.com/s/dXLlFgQS_3KHm8YRyDC7ZQ

shell 总结

https://www.junmajinlong.com/shell/index/

linux 特殊字符总结

https://www.linuxidc.com/Linux/2015-08/121217.htm
https://blog.csdn.net/xiaozhu_you/article/details/100699606

shell 执行流程

https://www.cnblogs.com/f-ck-need-u/p/7426371.html

image
#入门 单引号 双引号 反斜杠
https://blog.csdn.net/weixin_42183399/article/details/80825986 
# [shell中单引号、双引号、反斜杠说]
https://www.cnblogs.com/loki717/p/7358125.html

\$、\"、\\

echo "Hello World!"   #双引号不能打印感叹号
判断是否为 交互式shell
echo $-;shopt login_shell


 https://blog.csdn.net/BadMushroom/article/details/79756726 
sh -x
在输出的信息中,在加号后面的数据其实都是命令串,由於 sh -x 的方式来将命令运行过程也显示出来, 如此使用者可以判断程序码运行到哪一段时会出现相关的资讯!

Linux命令行和shell脚本编程宝典 Richard Blum 
 https://www.geek-share.com/detail/2559329634.html   
 https://www.geek-share.com/detail/2607454511.html 
 
while read line [linux] shell 学习
 https://blog.csdn.net/qq_22083251/article/details/80484176 
这里有一个原则,这个原则掌握好了,这个问题就很简单了:
对循环重定向的输入可适用于循环中的所有需要从标准输入读取数据的命令;
对循环重定向的输出可适用于循环中的所有需要向标准输出写入数据的命令;
当在循环内部显式地使用输入或输出重定向,内部重定向覆盖外部重定向。

$ read host ip name
linux 10.0.0.1 licong
$ echo $host $ip $name
linux 10.0.0.1 licong

#管道
ps -elf | grep "sshd"

cat a.log | grep "hello world"
在shell下,这种管道称为匿名管道,即没有名称的管道。它对于编写命令行来说非常方便,且逻辑清晰易懂,shell脚本和shell命令行几乎靠它打下了半壁江山。

在shell下,还支持使用mkfifo命令创建命名管道(named pipe),即有名称的管道,它也称为FIFO,它可以协调任意进程间的数据通信。

例如,创建命名管道文件a.fifo,a.fifo就是这个命名管道的名称。虽然它以文件的方式存在于磁盘上,但它传递数据的方式不会经过磁盘IO,而是直接在内存中传递,所以速度非常快,文件名仅仅只是这个命名管道的名称而已,是引用这个管道的入口和出口。

IFS

bash下的很多命令都会分割单词,绝大多数时候默认是采用空格作为分隔符,有些时候遇到制表符、换行符也会进行分隔。
最典型的是"for i in a b c",它会分割变量列表"a b c"使其成为三个变量。这种分隔符是由IFS变量指定的。
set | grep $IFS

示例: 不同
[root@master ~]# echo $a
-s
[root@master ~]# echo $a | wc -m
3
[root@master ~]# echo "$a" | wc -m
4

#数组
https://blog.csdn.net/h106140873/article/details/97234808


#-print0 -0
find . -name "*.txt" | xargs rm  #如果删除的文件名之间有空格 
 https://www.cnblogs.com/liuyihua1992/p/9689314.html 
#目录空格
 https://www.cnblogs.com/wjyHIT2011/p/6801727.html 
1、按照Linux推荐的文件命名规范,对文件夹名进行修改;
2、使用转义符 \;
3、成对使用双引号 "";


#xargs 处理
#总结
https://www.cnblogs.com/suanec/p/8331242.html 
https://www.cnblogs.com/f-ck-need-u/p/5925923.html 
xargs处理的优先级或顺序了:先分割,再分批,然后传递到参数位。

分割(xargs、xargs -d、xargs -0),分割后如何划批(xargs -n、xargs -L),参数如何传递(xargs -i)。另外xargs还提供询问交互式处理(-p选项)和预先打印一遍命令的执行情况(-t选项),传递终止符(-E选项


加 -i 参数直接用 {}就能代替管道之前的标准输出的内容;
加 -I 参数 需要事先指定替换字符。
加 -L 和小写l 相同,建议用-L符合POSIX标准,是按照段来划分,
         其实-L是指定传递的最大段数,也就是分批 max-lines也是一样的
         和-n选项类似,唯一的区别是-L永远是按段划批

     -p 操作具有可交互性,每次执行comand都交互式提示用户选择
而 -n在和独立的xargs一起使用时是按空格分段划批的。

#测试文件
rm -fr *
mkdir a b c d test logdir shdir
touch "one space.log"
touch logdir/{1..10}.log
touch shdir/{1..5}.sh
echo "the second sh the second line" > shdir/2.sh 
cat <<eof>shdir/1.sh  
> the first sh
> the second line
> eof

#xargs 默认是 echo ,以下两条命令是相同的
[root@k8s-master cptest]# cat shdir/1.sh 
the first sh
the second line
思考区别
cat shdir/1.sh | xargs
the first sh the second line
cat shdir/1.sh | xargs echo
the first sh the second line
将分行处理掉不是echo实现的,而是管道传递过来的stdin经过xargs处理后的:将所有空格、制表符和分行符都替换为空格并压缩到一行上显示,这一整行将作为一个整体,这个整体的所有空格属性继承xargs处理前的符号属性,

思考区别:
echo "/etc/inittab" | cat
echo "/etc/inittab" | xargs -t cat
对于xargs,它将接收到的stdout处理后传递到xargs后面的命令参数位,不写命令时默认的命令是echo。


#ls | xargs echo  与  ls | xargs -i echo {}的输出 并不同
由于-i选项是按分段来传递的。所以尽管看上去等价的xargs echo和xargs -i echo {}并不等价。
加 -I 参数 需要事先指定替换字符
# x 为替换字符,可以写成任何字符
echo 1234  | xargs  -I "x" echo x

ls | xargs echo 
a b c cptest d logdir one space.log shdir test

ls | xargs -i echo {}
a
b
c
cptest
d
logdir
one space.log
shdir
test

#分批选项
ls | xargs -L 3 -p 
而-n在和独立的xargs一起使用时是按空格分段划批的。-L是指定传递的最大段数,也就是分批。
-i、-L、-n选项都是分批选项。它们的生效规则是,谁指定在后面,谁就生效。
下面给出证明。
下面-i放在-n、-L之后,结果是-n、-L被忽略。

#总结
空格、制表符、分行符替换为空格,引号和反斜线删除。处理完后只有空格。如果空格、制表符和分行符使用引号包围则可以保留

文本意义上符号:空格、制表符、反斜线、引号:未经处理就已经存在的符号,例如文本的内容中出现这些符号以及在文件名上出现了这些符号都是文本意义上的。
非文本意义的符号(标记意义上的符号):处理后出现的符号,例如ls命令的结果中每个文件之间的制表符,它原本是不存在的,只是ls命令处理后的显示方式。还包括每个命令结果的最后的换行符,文件内容的最后一行结尾的换行符。


#文件名中有空格的情况
方法一:通过常用的find的-print0选项使用\0来分隔而不是\n分隔,再通过xargs -0来配对保证one space.log的整体性。因为-print0后one space.log的前后各有一个\0,但是文件名中间没有。

# find -name "* *.log" -print0 | xargs -0 rm -rf
当然,能使用-0肯定也能使用-d了。

# find -name "* *.log" -print0 | xargs -d "x" rm -rf     #随意指定非文件名中的字符都行,不一定非要\0
方法二:不在find上处理,在xargs上处理,只要通过配合-i选项,就能宣告它的整体性。

# find -name "* *.log" | xargs -i rm -rf "{}"

# 参数过长
#cd logdir
# touch {1..1000000}
-bash: /bin/touch: Argument list too long

[root@xuexi logdir]# echo {1..1000000} | xargs  touch      #执行的时候记得使用-p选项,否则慢慢等吧。
xargs有一个默认的选项-s,它指定每次传递的最大字节数,如果不显式指定-s,系统默认是128KB。

#判断
[ ! -n ] 判断变量如果不为空则条件成立
[ ! -d ] 判断变量如果不是目录则条件成立

#接收用户输入read 
 https://www.cnblogs.com/zqifa/p/linux-shell-1.html 


相关文章

网友评论

      本文标题:shell 总结及思考

      本文链接:https://www.haomeiwen.com/subject/oqcgyhtx.html