linu系统管理中和shell编程中常用的技巧

简介:

1 循环(命令执行...但参数会变)

如以下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env bash
#encoding=utf-8
a="
value1
value2
value3
value4
value5
value6
"
for  in  $a
do
         echo  "cmd $i argv"
done


注意: $a 不能写成"$a",否则只能成为一个变量,不能成为被迭代的循环


2 使用系统自带函数,颜色输出

1
2
3
4
5
6
7
#!/bin/bash
/etc/init .d /functions
if  grep  -q swap  /etc/fstab ; then
     action  "系统存在swap分区"  /bin/true
else
     action  "系统不存在swap分区"  /bin/false
fi


注意:

1 使用的是系统库functions中的函数

2 /bin/true返回码($?)是0,/bin/false 返回码是1

3 携带在functions脚本中的环境变量

    # Set up a default search path.

    PATH="/sbin:/usr/sbin:/bin:/usr/bin"

    export PATH


3 命令块一起执行----花括号的作用之一

#!/bin/bash

1
2
3
4
5
[ -d  /data/  ] && {
cd  /data
touch  1
rm  -f 1
}


注意: 

1 {} 一定要分行写或者带空格,并且cmd后面一定要有分号{ cmd1; cmd2; cmd3; },{cmd1; cmd2; cmd3}这个格式是错误的

与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,所以避免使用小括号作为命令组,小括号会新开的一个shell,所以小括号中的变量不能被后面继续使用


参考:http://blog.csdn.net/tttyd/article/details/11742241

4 大括号的展开--发括号的作用二

展开,以逗号进行分隔展开

1
touch  {1,2,3}.txt

连续的扩展展开以..分隔顺序列表的起始

1
2
# echo {a..c}.txt 
a.txt b.txt c.txt

注意:大括号中不允许存在空格



5. ssh的自动化选项

1
ssh  $ip -o UserKnownHostsFile= /dev/null  -o ConnectTimeout=3  -o BatchMode= yes  -o StrictHostKeyChecking=no




6 screen

screen -S name  创建一个这样的窗口 虚拟终端

screen -ls

screen -r name/id  恢复窗口

ctrl +a +d 退出但不关闭窗口

ctrl +a  +k 杀掉当前会话窗口

ctrl +a +z 将这个会话挂起回到 SHLVL=1 的状态(fg 1 恢复)

screen -d pid/name 将这个窗口置为离线

echo $SHLVL 可以检查是不是在窗口中还是在正常的shell终端中

screen -x 多个人同时可以看处于Attached的窗口动态(适合远程多个人需要看屏

幕) 

注: screen 中会话的三种状态

1 Attached  处于运行当中的,如果你要 screen -x name/pid 可以看 

2 Detached 处于离线的 screen -r name/pid 可以恢复到那个窗口

3 Dead 处于被kill -9 pid 杀死的,如果需要移除 screen -wipe pid/name



7 shell中生成进度条的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function  sleepPrograss() {
     [ $ # -eq 0 ] && echo "sleepPrograss Usage: sleepPrograss 10 "
     [ $ # -eq 0 ] && return 1
     allTime=$1
     strDone= ''
     stepTime=$( echo  "scale=1; $allTime/100"  bc )
     for  ((i=0; $i<=100; i+=1))
     do
         printf  "progress: [%-100s] %d%%\r"  $strDone $i
         sleep  $stepTime 
         strDone+= '#'
     done
     echo
}


8. 关于for的几点

#help for

官网说明:

格式1: for: for NAME [in WORDS ... ] ; do COMMANDS; done

当in后面的省略,将默认循环"$@"

格式2: for (( exp1; exp2; exp3 )); do COMMANDS; done

exp1 exp2 exp3都是数学算术。支持C语言风格。


举例1:

1
2
3
4
5
6
7
8
9
#!/bin/bash
function  for_name() {
     age=$1
     echo  $age
     shift  1
     for  element  in  "$@"  do
         echo  $element
     done
}


for_name 21 name1 name2 name3

举例2:

1
2
3
4
5
#!/bin/bash
a=4
for  ((i=1;i<$a;i++));  do
     echo  $i
done


9.关于while read line 循环读取行

重点提示: 这里最关键的就是理解read 这个命令的作用

1 while的用法: while COMMANDS; do COMMANDS; done

2 read 的用法: help read 

Reads a single line from the standard input, or from file descriptor FD

    if the -u option is supplied.  The line is split into fields as with word

    splitting, and the first word is assigned to the first NAME, the second

    word to the second NAME, and so on, with any leftover words assigned to

    the last NAME.  Only the characters found in $IFS are recognized as word

    delimiters.


翻译: read读一行,来自标准输入,或者-u 指定文件描述符。此行用$IFS进行分隔这一行。将分隔后的第一给word给第一个变量,第二个word给第二变量,如果,如果word个数大于name个数,则将最后的word分给最后一个name。

理解起来有点绕。看下面这个例子

1
# echo "word1 word2 word3" | { read name1 name2; echo "name1:$name1"; echo "name2:$name2"; }

name1:word1

name2:word2 word3


看到了把,name1被word1给赋值。 name2被word2 和word3 赋值。(因为word个数比name多)



坑1:

[root@master std]# echo "abc" | read line

[root@master std]# echo $line


[root@master std]# 

结果为空,为什么呢?

解释:在shell中,管道即创建一子shell,在子shell中 $line为abc,但是执行完成后回到父进程,当然$line就是为空的了(子进程的环境变量是不被父进程继承的)


改成以下就可以了(大括号不会创建一个子shell和管道右边在一个shell环境中):

echo "abc" | { read name; echo $name; }


理解2: 什么while却可以,因为管道的右边while都是爱一个subshell中的。

1
2
3
4
5
6
#!/bin/bash
cat  /etc/issue  while  read  line;  do
     echo  "$line"
     a=1
done
echo  "a value is:$a"


如何验证while循环体是在一个subshell的中的呢? 看结果,$a的值为空,因为subshel的遍历是不能被父shell继承的。





10.关于通配符,常用在shell的命令中--区别正则表达式

常用:

* 匹配任何包括空或无字符

? 一个字符

[abc] a、b、c中的任何一个

[1-9]  表示1至9中的任何一个数字

[!1-2]  非1或2的任意一个数字 

[!abc]  非a、b、c中的任意一个字符


实践: 创建一系列的日志

touch app{01..23}.log


只显示 app11.log app12.log app21.log app22.log 

ls app[1-2][1-2]*



11 一个文件中截取指定段

dd 结合skip参数

dd if=messages of=test.out bs=1 skip=1215739518

bs 指定一个block的size大小

skip BLOCKS ibs-sized blocks at start of input


将文件messages文件从1215739518开始读取的内容写入到test.out中






12  du * -sh 报错

du: invalid option -- '2'

du: invalid option -- '1'

du: invalid option -- '6'


使用: du -sh -- *

If you pass '--' to the command, that signifies no further options will be sent, so run the command like this:

du -fh -- *

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1783616如需转载请自行联系原作者

cuizhiliang
相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
18天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Shell
Shell编程(下)
Shell编程(下)
88 1
|
1月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
40 1
|
1月前
|
Shell Linux 开发工具
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
65 12
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
45 12
|
2月前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
49 5