shell 学习

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`

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值