前言
有时候阅读一些脚本语言的时候总是遇到很多问题,并且学了几次,也没学出太好的效果,这次基本强调语法。主要为了可以阅读懂大部分bash脚本为目的的思路,整理出自己的思路,好好总结一下bash的主要奇怪的语法,希望以后可以不用在这里纠结。
正文
这里主要顺序还是按照知识要点来记录,主要是用法,和一些例子,不会存在特别多的理论讲解,
1. io重定向—— >
这里指的是类似java中的io流的概念,可以让固定的指令产生的内容作为输入,比如
ls > test.txt;
ls >> test1.txt;
这是将当前目录内容直接生成一个test.tex文件,如果是`>>
,这个是将值连接到文件的末尾。
当我们重定向一个特殊变量时候,比如:
cat /dev/null > test.txt
: > test.txt #:这个代表啥也不做指令,所以为空,效果同上。
这里将空内容导入test.txt
重新写入文件,当然清楚了文件内容,
scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
command &>filename 重定向stdout 和stderr 到文件中
command >&2 重定向command 的stdout 到stderr
scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,则创建这个文件.<< 重定向,用在”here document”
<<< 重定向,用在”here string”
2. 注释
#开头的内容,指导行结束。
例如:
echo "hello world" #这是一行注释;
这#
功能很强大,我这里暂时举几个例子,
echo ${PATH#*:} # 参数替换,不是一个注释
echo $(( 2#101011 )) # 数制转换,不是一个注释
echo "$#" #输出所有参数,
3. 变量
这个脚本语言当然不含数据类型了,直接声明,例如:
dir=/home/myuser/project
cd $dir
这里是其他关于let的用法暂时省略,
4. 判断
?
这个可以用来判断,(())这个可以用作c语言风格的切换,当?
放在里面,可以用作三元操作,
[] 这个也是测试,
[[]] 也是
这个是相当复杂,可是这里主要记住一些test的参数,这里比较复杂,就不详细介绍,主要和if连用。
5. {}
这个可以扩展,比如:
cat {file1,file2,file3} > combined_file
# 把file1,file2,file3 连接在一起,并且重定向到combined_file 中.
cp file22.{txt,backup}
# 拷贝"file22.txt" 到"file22.backup"中
echo {file1,file2}\ :{\ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
可以和io重定向连接使用
File = ~/test.txt
{
read line1
read line2
} < $File
管道 |
| 管道.分析前边命令的输出,并将输出作为后边命令的输入.这是一种产生命令链的好方法.
echo ls -l | sh
cat *.lst | sort | uniq
# 合并和排序所有的".lst"文件,然后删除所有重复的行.
后台控制
& 例如
for i in 1 2 3 4 5 6 7 8 9 10 #第一个循环
do
echo -n "$i"
done&
连续操作
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)
# 更优雅的写法应该是
# cd source/directory
# tar cf - . | (cd ../dest/directory; tar xpvf -)
#
# 当然也可以这么写:
# cp -a /source/directory/* /dest/directory
# 或者:
# cp -a /source/directory/* /source/directory/.[^.]*/dest/directory
# 如果在/source/directory 中有隐藏文件的话.
这里用的是与。先执行前版部分,后开始执行
后记
这里基本我可以阅读一部分代码了,感觉流程不是太大问题,另外函数这里暂时省略,以后补充,这里有挺多的内容,以后完善。