之前在看abs-guide,觉得太详细了,手头这本Linux Shell Scripting Cookbook,200页出头,例子很多,准备用一周到两周的时间看完。
已经看了四天,勉强看到第四章,既懒又困,严重拖延进度。
明显感觉shell这东西,必须练出来,否了看了就忘,忘的比看的快。
照这么下去,前途暗淡啊。
这书一共9章:
第一章 小试牛刀
第二章 命令之乐
第三章 以文件之名
第四章 让文本飞
第五章 一团乱麻?没这回事
第六章 B计划
第七章 无网不利
第八章 当个好管家
第九章 管理重任
看书的时候觉得都能看懂,可是现在看着每一章的大标题,心里发怵,什么都想不起来,更谈不上什么知识系统。
试着说一下,第一二章是shell基础,第三章讲文件操作,第四章讲文本操作,第五章讲网页操作,第六章讲归档压缩加解密备份,第七章讲网络操作,第八章第九章讲系统主机管理。第一到四章属于基础部分,除了第六章,其他都属于实际应用。
每一章都有至少11至多18个鲜明应用主题,每个主题分三部分,新手上路,实战演练,工作原理。看着都这么清爽。但是作者讲的比较收,有些地方点到为止,不懂的自己着男人(man)。
觉得比较重要的命令 find xargs awk sed grep,但是现在看着这几个命令,脑袋空空如也,拔剑自顾心茫然,自刎乌江算了。。。
初学者,尤其我这样的初学者,最大的痛苦就是,不知道该怎么学,一心还急于求成,之前也试过很多次,但是看着看着就烦了。除了自我检讨毅力不足之外,考六级的经验告诉我,或者是方法不对。不能再自我矮化,就算是再自责,于问题的解决于事无补,还是在逃避。
实在看恶心了,google搜索how to learn shell script ?,搜出来的千篇一律不疼不痒。纸上得来终觉浅,要躬行啊要躬行。
第一章 小试牛刀
终端打印
echo printf
玩转变量与环境变量
通过shell进行数学运算
let (( )) $[ ] expr bc
expr不允许引用;bc必须引用,还可以进制转换,平方根。。
玩转文件描述符与重定向
重定向脚本内部的文本块 cat <<EOF> log.txt
自定义文件描述符 exec 3<input.txt cat <&3 使用一次后失效
数组和关联数组
array_var=(1 2 3 4 5 6)
declare -A ass_array
ass_array=([index1]=val1 [index2]=val2)
echo $(!array_var[*]) or echo $(!array_var[@])
使用别名
alias new_command='command sequence'
\new_command
获取终端信息
tput stty
获取、设置日期及延时
调试脚本
bash -x script.sh
函数和参数
向命令传递参数
command -p -v -k 1 file
command -pv -k 1 file
command -pvk 1 file
command file -pvk 1
读取命令序列输出
已不按回车的方式获取字符“n”
read -n num_of_chars variable_name
read -s var
read -p "Please input" var
read -t timeout var
read -d delim_char var
字符分隔符和迭代器
比较与测试
第二章 命令之乐
用cat进行拼接
cat concatenate
-s 压缩连续空白行
-T 将制表符显示为^I
-n 行号
录制与回放终端对话
script scriptreplay
文件查找与文件列表
find . \( -name "*.txt" -o -name "*.pdf" \) -print
find . -path "*hitagi*" -print
find . -iregex ".*\(\.py\|\..sh\)$" -print
-maxdepth -mindepth
-atime -mtime -ctime # -7 7天之内 +7 7天之前 7 恰好7天前
-amin -mmin -cmin
-size #b c w k M G
-delete #惨痛教训
-perm
-user USER
-exec
find . -type f -user root -exec cat {} \; > all_root_files.txt
-exec ./commands.sh {} \;
find . \( -name "*.git" -prune \) -o \( -type f -print \)
将命令输出作为命令参数(xargs)
echo "splitXsplitXsplitXsplitXsplitXsplit" | xargs -d "X" -n 2
cat arg1.txt | xargs -n 1 echo
cat arg1.txt | xargs -n 1 -I {} echo -p {} -l
find . -type f -name "*.txt" -print0 | xargs -0 rm f
用tr进行转换
echo hello 1 char 2 next 4 | tr -d -c '[0-9] \n'
tr -s ' '
校验和与核实
md5sum filename > filename.md5
md5sum -c filename.md5
sha1sum
filename.sha1
排序、单一与重复
sort -m sorted1 sorted2 #?
sort -nrk n1.m1 n2.m2 data.txt
sort -z data.txt | xargs -0
sort -bd data.txt
uniq
-u
-c
-s -w
-z
临时文件命名与随机数
分隔文件和数据
split -b 10k data.file -d -a 4 split_file
-l
csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log
根据扩展名切分文件名
${变量#关键词} 从头开始,符合最短删除
${变量##关键词} 从头开始,符合最长删除
${变量%关键词} 从尾开始,符合最短删除
${变量%%关键词} 从尾开始,符合最长删除
${变量/旧字符/新字符} 替换第一个
${变量//旧字符/新字符} 替换全部
用rename和mv批量重命名文件
#重写rename?
rename 's/ /_/g' *
rename 'y/a-z/A-Z/' *
拼写检查与词典操作
交互输入自动化
echo -e "1\nhello\n" | ./interactive.sh
第三章 以文件之名
生成任意大小的文件
dd if=/dev/zero of=junk.data bs=1M count=1
文本文件的交集与差集
comm
-1
-2
-3
comm A.txt B.txt -3 | sed 's/^\t//'
查找并删除重复文件
#? sed awk
创建长路径目录
mkdir -p
文件权限、所有权和粘滞位
u
-
S 允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的
d
r 允许读取目录中文件和子目录的列表
w 允许在目录中创建或删除文件或目录
x 是否可以访问目录中的文件和子目录
o
d
t or T 只有创建该目录的用户才能删除目录中的文件
chown uesr.group . -R
chmod 777 . -R
创建不可修改文件
chattr +i file
批量生成空白文件
touch filename
-a
-m
-d
查找符号链接及其指向目标
readlink
列举文件类型统计信息
declare -A statarray
file -b "$line"
echo ftype : ${statarray["$ftype"]}
环回文件与挂载
#?
生成ISO文件及混合ISO
#?
查找文件差异并进行修补
diff -u version1.txt version2.txt > version.patch
patch -p1 version1.txt < version.patch
diff -Naur directory1 directory2
head与tail——打印文件的前10行或后10行
head -n N file
head -n -N file
tail -n N file
tail -n +(N+1) file
PID=$(pidof gedit)
tail -f growing_file --pid $PID
只列出目录的其他方法
ls -d */
ls -F | grep "/$"
ls -l | grep "^d"
find . -maxdepth 1 -type d -print
在命令行中用pushd和popd快速定位
pushd /var/www
pushd /usr/src
pushd /usr/src
pushd /etc
dirs
pushd +3
popd +1
cd -
统计文件的行数、单词数和字符数
wc -l
wc -w
wc -c
wc file -L
打印目录树
tree
sudo apt-get install tree