1. shell 根据表现方式与读取使用者输入种类的不同,可分为两大类:
1. Text base : 文字向导
2. Graphic base :图形向导
2. Bash 有两种工作模式:交互模式,非交互模式
3. /dev/null 是只写文件,传说中的黑洞。
4. 合法的shell都标记在 /etc/shells 里面
5. 常见转义字符:
单引号 ' | \' |
双引号 “ | \" |
星号 * | \* |
? | \? |
倒斜线 \ | \\ |
~ | \~ |
` | \` |
! | \! |
# | \# |
$ | \$ |
& | \& |
( | \( |
) | \) |
[ | \[ |
] | \] |
{ | \{ |
} | \} |
; | \; |
< | \< |
> | \> |
/ | \/ |
| |
6. 让script在现行的shell中执行2种方法:
1. . /root/tmp/test.sh (注意点和/之间有空格) 2. source /root/tmp/test.sh
7 .
实战Linux shell 编程与服务器管理 笔记
开启文件 fd<>filename
关闭文件 fd<&- fd>&- 不用的文件及时关闭是好习惯
复制文件代码,建立文件连接 n<&m 复制m,存成n,也就是将m连接到n
n>&m 复制m存成n,使n连接至m
列出系统内定义的信号:
kill -l 或者 trap -l
查找说明 man 7 signal
如果使用kill或killall发送信号时没有提供信号,默认为 SIGTERM
为什么 kill -TERM pid 有时不能终止进程?(TERM和-9里面都有杀死的意思)
因为进程中可以重新定义对信号 TERM的处理方式,而不能重定义-9的处理。
KILL和STOP这两个信号无法用trap捕捉,也无法忽略。
trap运用: trap 触发指令 信号串行
取消: trap '-' 信号串行
忽略: trap '' 信号串行
清空历史bash记录文件 history -c
注意: ~不可以放在单引号或双引号中,否则会失去家目录的替换效果
ls -a -A 区别 -a 会有 . .. 但 -A没有,都会显示隐藏目录
当用命令替换产生的参数过多传递给下面的程序时,会报参数行过长的错误信息,而无法正常运作。这时,可以改用find或xargs。
declare在脚本中不好使,原因没有使用bash进行脚本解析,例如我没有添加脚本的执行权限,直接使用 sh filename.sh 结果报错说 declare not found ,并且for syntax
error,解决方法有两种,一种是用 bash filename.sh 另外一种是在脚本开头添加 #! /bin/bash 然后给脚本加执行权限,之后 ./filename.sh 就可以了。
建立多级目录 mkdir -p t1/t2/t3
建立目录时指定目录权限而不是由umask决定 mkdir -m 755 dirname
对于使用ln 硬链接建立的关联文件,两个文件指向同一个文件,删除其中一个文件时,计数器减1,知道最后计数器为0了,才会删除整个文件。
软链接呢?
建立特殊文件 mknod option filename [bcp] major minor
命名管道是有路径的,在一个目录下建立的命名管道只能在对应的目录下才可找到。
craker会用 chattr +i filename 来使得文件不得修改,即使root也不行,这样就无法删除了, 需要用 chattr来移除属性即可。lsattr查看文件属性
stat 查看文件信息 大小,连接数目等等。
转码工具 iconv
默认关闭,除非允许
iptables -L -n 查看 iptables 的设定情况
由用户自定义的自动执行文件,已由原来的/etc/init.d/rc.local 移到/etc/rc.local
生成摘要:
md5sum filename > filename.md5
校验: md4sum -c filename.md5
sha1 filename > filename.sha1
校验: sha1 c filename.sha1
查看系统开启了哪些服务? 如何关闭,开启等等
postfix发一封邮件
bash 4.0之后的新特性,支持数组的key value模式
支持switch的连续匹配模式,支持类似perl,python的连续数字生成模式。大小写转换^, 还有一个 ** 用来列出当前目录下的所有文件列表省去使用find的麻烦。
备份: cp cpio dump tar
tar -cvjf tar.bz2 dirname_or_filename
tar -cvzf tar.gz dirname_or_filename
查看tar包中的文件
tar tvf tarfilename
如果使用了压缩算法,那么要使用对应的参数才能查看tar包中的文件
tar tvjf tarfilename
如果要解压到某一特定目录,该目录一定要事先存在才行
tar xvf tar_filename -C path
向tar包中增加文件 r选项 (但要注意如果使用了压缩,那么必须先解压才能添加)
tar rvf tar_filename file
bunzip2 tar_filename
tar rvf tar_filenaem appendfile_name
bzip2 tar_filename
合并tar文件:
tar Avf file1.tar file2.tar file3.tar
删除tar中某一文件
tar vf etc.tar --delete etc/hosts
与实际文件系统比较(需放在同一目录)
tar dvf etc.tar
tar 还可以进行远程备份
tar cvf 主机:/路径/文件名 文件或目录
用tar进行标识
tar cvf home.tar -V backup_`date %Y%m%d%H%M` /home
差异性备份:
tar cvf home.tar -g /var/log/home-1.snar /home
tar cvf home-1.tar -g /var/log/home-1.snar /home
还原 :
tar xvf home.tar -g /dev/null # 无需参考数据
tar xvf home-1.tar -g /dev/null
dd 低阶层次的备份,可以拷贝整个硬盘,按区拷贝,可以把MBR直接复制出来
复制光盘
dd if=/dev/cdrom of=/bk/mycd.iso bs=2048 conv=sync,notrunc
题目:
1. 删除指定文件的前100个字节,即头部的100个字节。
tail -c +101 filename
2. 删除指定文件的末尾100个字节。
crontab 命令
cron是时间计量单位,百万年的意思。名字很霸气。
用法 分、时、日、月、星 command path
几个符号:
* : 任何时间
/ : 每隔多长时间
- : 一个时间段
, : 分隔每个时间。
星期: 0-6, 0是星期日
一个需要牢记的重定向的例子:
./a.out > out.txt 2>&1 正常
./a.out 2> out.txt 2>&1 还是输出到终端上,文件中没有
./a.out > out.txt 2>&1 正常
测试程序
#include <stdio.h> int main() { char *pout = "stdout test\n"; char *errout = "stderr test\n"; fwrite(pout, strlen(pout), 1, stdout); fwrite(errout, strlen(errout), 1, stderr); return 0; }
fwrite(char *buffer, size_t size, size_t nmemb, FILE *fp);
tar 打包时不包括特定文件、文件件
tar -cvf tarbao.tar --exclude=dir/excludefilename
tar -cvf tarbao.tar --exclude=dir/excludefodername/*
rm 删除特殊字符文件, 分两种:
a) 以--开头的文件 rm -- --exclude
b) 乱码文件
首先 ls -i 列出文件的节点ID, 如: 123456789
然后 find ./ -inum inode_value -print -exec rm -rf {} \;
两个去重文件的并和交集:
cat a b | sort | uniq -d > c # c 是a和b的交集
cat a b b | sort | uniq -u > c # c 是a和b的不同
xargs 的 -I -i参数
cat hosts | xargs -I{} ssh root@{} hostname
shell 几个内置符号常量:
$@ 参数数组: "a" "b" "c"
$* 所有的参数, 一个字符串: "a b c"
$# 参数个数, 如 ./test a b c 为3
shell 的函数返回值只能是0-255的数值。通过$?查看。 如果需要返回字符串,使用子shell调用,并用echo打印,用变量接收。
几个简单命令:
tar -zcvf hello.tar.gz hello/
tar -jcvf hello.tar.bz2 hello/
tar -zrf hello.tar.gz append.txt
tar -tf hello.tar.gz
以16进制查看文件:
hexdump -C filename
hexdump -c filename
linux 下 在文件浏览器下,F3可以切出一个竖屏来。
去掉空行: sed '/^$/d' filename
奇偶行分离:第一行是奇数行,从1开始奇数
awk 'NR%2==0' filename
awk 'NR%2==1' filename
1. 为输出着色
大多数情况下,你希望输出带颜色的结果,比如绿色代表成功,红色代表失败,黄色代表警告。
NORMAL=$(tput sgr0)
GREEN=$(tput setaf 2; tput bold)
YELLOW=$(tput setaf 3)
RED=$(tput setaf 1)
function red() {
echo -e "$RED$*$NORMAL"
}
function green() {
echo -e "$GREEN$*$NORMAL"
}
function yellow() {
echo -e "$YELLOW$*$NORMAL"
}
# To print success
green "Task has been completed"
# To print error
red "The configuration file does not exist"
# To print warning
yellow "You have to use higher version."
获取目录名和文件名:
dirname $filepath
basename $filepath
读取超时设置
READ_TIMEOUT=60 read -t "$READ_TIMEOUT" input # if you do not want quotes, then escape it input=$(sed "s/[;\`\"\$\' ]//g" <<< $input) # For reading number, then you can escape other characters input=$(sed 's/[^0-9]*//g' <<< $input)
HERE DOCUMENT
cat << EOF
sssss
what i write is what you will see format
yes
EOF
用户配置值vs. 默认值
URL=${URL:-http://localhost:8080}
字符串长度:
${#strname}
检查特定可执行的文件是否存在
OK=0 FAIL=1 function require_curl() { which curl &>/dev/null if [ $? -eq 0 ] then return $OK fi return $FAIL }
这里使用which来命令查找可执行的curl 路径。如果成功,那么可执行的文件存在,反之则不存在。将&>/dev/null设置在输出流中,错误流会显示to /dev/null (这就意味着在控制板上没有任何东西可打印)。
有些极客会建议直接通过返回which来返回代码。
# From cool geeks at hacker news function require_curl() { which "curl" &>/dev/null; } function require_curl() { which -s "curl"; }
tr 命令:translate or delete characters
tr -s "a" #删除连续的多个a,只保留第一个
tr -s "a" "b" #将a替换为b,并删除连续的多个b,只保留第一个
tr "abc" "xyz" # 字符替换,a替换为x,b替换为y,c替换为z
tr -d "abc" #删除所有字符"a",“b”,"c"
tr -d "\n" #删除空行
tr -c "a-zA-Z0-9\n\- " "@" #替换文本中"a-zA-Z0-9\n\- "以外的所有字符为@。传说中的补集
cat out.txt | grep "delete" 报错如下:
grep:Binary file (standard input) matches
这是grep认为这是binary file,无法进行搜索。
解决方法:
grep -a "delete" # -a 是说
-a, --text
Process a binary file as if it were text; this is equivalent to the --binary-
files=text option.
#一个填充0的函数 function fillzero { ((i=$1)); if [ $i -lt 10 ]; then echo 0$i; return; fi echo $i; } #调用 fillzero $var1
替换文件中的tab为空格:
1. vim 打开要操作的文件
2. 替换空格
:set ts=4
:set expandtab
:%retab!
设置文件的编码:
1. vim打开要操作的文件
2. 查看编码:
:set fileencoding
3. 设置编码:
:set fileencoding=gbk
shell接收参数函数:
while getopts c:v:d:f: opt do case $opt in c) echo $OPTARG ;; *) echo "unknown opt:$opt" exit 0 esac done
source /home/work/a/b/bashrc 时,如果想在bashrc知道自己的路径怎么办?
BASE_HOME=`dirname ${BASH_SOURCE}` cd ${BASE_HOME} BASE_HOME=`pwd`