- 浏览: 215468 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (391)
- java (18)
- python (3)
- ruby (4)
- linux (48)
- 网络 (9)
- 前端 (2)
- 社会、文化、哲学、人生、百态 (0)
- 工具 (10)
- 下载 (0)
- 常用地址 (0)
- tracert (0)
- mysql (8)
- 开源相关收藏 (1)
- 模块查看依懒 (1)
- watch使用 (1)
- Tcpdump (2)
- easy_install安装 (1)
- 构造redis批量删除脚本 (1)
- MYSQL 性能测试 (1)
- JAVA code encode utf-8 (1)
- linux nginx awk 实时 每妙 (1)
- mkpasswd (1)
- spring security oauth (1)
- jmap dump java memory Analyzer (1)
- JAVA DUMP (1)
- swap linux 过高 解决 (1)
- SWAP (1)
- jmap jstat jstack dump (1)
- java jconsole 的使用 (1)
- git 常用 (1)
- MYSQL 索引 动态 唯一 (1)
- TCP 三次握手 四次挥手 (1)
- linux date (1)
- 删除 空行 注释行 (1)
- maven3 yum linux install repository (1)
- linux git 搭建 (1)
- linux sar eth1 查看 流量 (1)
- sar (1)
- netstat ip 过滤 常用脚本 (1)
- Tcpdump 包分析网络连接过程 (1)
- net ipv4 tcp time wait tw recycle (0)
- /etc/sysctl.conf linux 网络 配置 (1)
- ss 网络连接查看 (比netstat 快很多,实时性牺牲) (1)
- MYSQL 关键字 (1)
- Linux 下多核CPU知识 (1)
- top (1)
- 令牌 证书 (1)
- mysql unix timestamp (1)
- 端口扫描 nc nmap (1)
- 204 http code 状态码 (1)
- ss -s ss -l (1)
- linux 常用 curl (1)
- linux sed 替换 换行 (1)
- centos yum install rpm install (1)
- spring-mvc源码解读 (1)
- 使用iftop查看实时的网络流量 (0)
- linux 命令 expect (1)
- HTTP (1)
- openssl ddif 加密 (1)
- iptables 详解 (1)
- python 虚拟化 VirtualEnv virtualenvwrapper (1)
- nginx (2)
- more less 实用技巧 (1)
- linux nginx (2)
- linux curl https ssl 证书 ca (1)
- openssl (1)
- php mysql linux (1)
- linux 虚拟机 虚拟 xen (0)
- linux 虚拟机 虚拟 xen kvm (1)
- linux perl 单行执行技巧 (1)
- mysql 查看库占用空间 表查用空间 (1)
- linux tcpdump (1)
- maven (1)
- sun.misc.Unsafe (1)
- OpenSSL生成证书 (1)
- http://blog.csdn.net/zzulp/article/details/8018751 (1)
- maven 本地 jar dependency (1)
- 计算JAVA代码行数最简单命令 sed (1)
- 常用的证书格式转换 rsa eg (1)
- 加密 解密 签名 (1)
- 分析jar包冲突 (1)
- 使用JMockit编写java单元测试 (1)
- Linux 技巧:让进程在后台可靠运行的几种方法 (1)
- 环境变量控制 (1)
- 5+ 个 tar 命令的用法,附示例 (1)
- scp自动输入密码 (1)
- ps axo pid (1)
- ppid (1)
- comm (1)
- pmem (1)
- lstart|grep mysql (0)
- lstart (1)
- etime|grep mysql (1)
- UML类图字少好理解 (1)
- HTTP经典文章 (1)
- git (1)
- Git常用命令 (1)
- LINUX 系统被攻击的分析过程 (1)
- NIO (1)
- LINUX 操作快捷键使用 (1)
- openSSL命令、PKI、CA、SSL证书原理 (1)
- shell (2)
- 转载 (1)
- mysqldump 可以直接dump->xml (1)
- VIM比较全面的文章 (1)
- eclipse regex 正则表达式 (1)
- synchronized (1)
- 锁 (1)
- java 正则表达式 regex (1)
- Reference Queue 引用 源码 (1)
- spring aop 源码 分析 (1)
- java @Cache @Transaction 注解 (1)
- spring aop (1)
- spring jdk proxy cglib 动态代理 性能比较 (1)
- spring proxy private public 代理限制 (1)
- spring transaction aop 事务 (1)
- spring autowire 注解注入 (1)
- 桥接 NAT NAT地址转换 内部网络 虚拟网络 (1)
- spring-web-mvc 源码解读 之 RequestMappingHandlerMapping (1)
- find atime mtime ctime -n n +n (1)
- android studio 快捷键初探 (1)
- android 源码阅读的计划 (1)
- 计算机网络学习-VLAN (1)
- sed 高级 合并行 (1)
- CAP 一致性 可用性 分布式容错性 (1)
- android lib so 库文件 (0)
- android lib so 库文件 移植 (1)
- android 不错的博文 (1)
- sourceinsight 源码 阅读 (1)
- Android Tab UI (1)
- 诗 (1)
- mysql 批处理 (0)
- netty 堆外内存 DirectByteBuffer (1)
- netty 并发 百万 推送 (1)
- Linux操作系统中内存buffer和cache的区别 (1)
- maven intellij target bytecode version (1)
- linux sleep()的实现原理 (1)
- android (2)
- javadoc 代码注释规范 (1)
- spring 自动注入bean auto (1)
- Photoshop CS6常用快捷键 (1)
- 股票 数据 机器 分析 (1)
- 批处理 (1)
- mysql -e (1)
- char (1)
- Unicode (1)
- 编码 (1)
- utf8 (1)
- utf-8 (1)
- utf16 (1)
- utf-16 (1)
- IntelliJ IDEA (1)
- ide (1)
- idea (1)
- intellij (1)
- 文件 (1)
- 目录 (1)
- 源代码 (1)
- CountDownLatch (1)
- CyclicBarrier (1)
- Semaphore (1)
- spring (1)
- linux 查看不同进制文件 (1)
- WebMvcConfigurationSupport (1)
- sdkman工具的使用 (1)
- http header (1)
- LINUX系统优化 (1)
最新评论
-
gelongmei:
威武我大酒神
shell脚本不换行刷新数据
SHELL脚本整理的比较好http://www.cnblogs.com/tianyajuanke/archive/2013/09/23/3334485.html
shell 脚本的第一行一般为:
#! /bin/sh
ll /bin/sh 可以发现 sh 是一个指向 bash 的软连接。脚本文件一般有两种运行方式,一种是作为 sh 命令的命令行参数,另一种是将脚本作为具有可执行权限的可执行文件,对于后一种方式来说,上面的那句话就有作用了,它指定了调用哪种解释器来运行脚本。
date:用于显示和设置时间
复制代码
#输出时间:
date #以本地时间格式输出当前时间
date +%s #以时间戳形式输出当前时间
#本地时间格式与时间戳转换:
date +%s -d "2013/9/23 10:40:00" #将指定时间转换成时间戳>格式
date -d @1379895103 #指定时间戳转换成本地时间格式
#设置时间:
date -s 2013/9/23 # date -s 2013-9-23
date -s 10:30:00
date -s "2013/9/23 10:30:00"
复制代码
time:计算某一任务运行的时间。通过 type -a time 查看,可以发现 linux 中有两个 time,还有一个是 /usr/bin/time ,没有可安装,它显示的信息比下面会更多一些,包括一些CPU占用和IO等情况,使用方法如 /usr/bin/time -v make -j4,此处略过。
复制代码
# TIMEFORMAT 环境变量用来自定义输出的时间格式
export TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S' # 有 -p 参数的时间格式
time date
export TIMEFORMAT=$'real %2R\n' # 只输出 real 时间
time date
export TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' #默认时间格式
time date
time -p date # -p 参数可以指定以 POSIX 缺省时间格式打印结果,单位为秒
复制代码
who: show who is logged on
who -aH #输出系统上次引导时间、当前运行级别和当前登陆用户,及其它用户登陆信息,-H 表示显示表头(即标题)
who -b # -b: boot 上次引导时间
who -r # -r: run 当前运行级别,同 runlevel
who -u # -u: user 当前登录用户
whoami # 只输出当前登录用户的用户名
wc 计算机文件中的行数、单词数和字符数
wc -l /etc/passwd # -l: line 行数
wc -w /etc/passwd # -w: word 行数
wc -c /etc/passwd # -c: char 行数
wc -l ~/code/src/*.cpp # 依次输出 ~/code/src/*.cpp 的行数与总量
ls -l *.cpp | wc -l # 查看当前目录有多少个 *.cpp 文件
cp 复制命令
cp -u # -u: update 当源文件比目标文件新的时候,才复制
cp -p # -p: preserve 保持源文件的属性:模式,所有权,时间戳
cp -s # -s: symbolic-link 软连接,同 ln -s ,ln 默认为硬连接
注:硬连接(Hard Link):硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接(Symbolic Link):软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
mkdir 创建目录
mkdir -pv -m=rwx test/test
# -p: parents 两个作用:1、可以创建需要的多级目录。2、即使目录存在,也不报错
# -v: verbose 创建详情,如果创建成功则输出信息
# -m: mode 创建时赋予权限,同 chmod
不同文件的特殊字符标识:可以通过 ls 命令查看,也可以通过 file 命令。
复制代码
- # 普通文件,如文本文件,二进制文件等
d # 目录
l # 符号连接文件(软连接)
c # 字符特殊文件,提供对设备不带缓冲的访问,每次访问长度可变。
b # 块特殊文件,提供对设备带缓冲的访问,每次访问以固定长度为单位进行。
p # 命名管道,用于进程间通信(IPC)
s # sockek,用于进程间网络通信
复制代码
chmod 修改权限
chmod 777 src # 777 分别设置 user\group\other 三者(all)权限,八进制方式,1表示执行,2表示写,4表示读,相加得复合权限,八进制方式只能设置权限,而不能增加或去除权限
chmod a-x src # =/+/- rwx 用于赋予或增加或去除权限,a 表示 all,也可为 u,g,o ,也可写成 ugo-x,默认不写为 a
chmod u+rwx,g+x,o=rw src # 同上,可以在一起分别设置
chmod a+x -R src # 递归修改目录权限
chmod a+x -v src # 输出修改成功后的权限信息
chown 和 chgrp : 修改所有者和所有组
chown -v -R root filename # 修改所有者 -R 表示递归修改,-v 输出修改结果
chown -v root:root filename # 修改所有者和所有组
chown -v :root filename # 只修改所有组,同 chgrp
chgrp -v root filename # 同上
后台进程:
可以在执行命令时,在命令后面加上 & 符号,使其在后台运行。如 make & ,但作业在后台运行一样会将结果输出到屏幕上,干扰工作。可以通过如下方式,把输出重定向到文件:
make -j8 > result 2>&1 &
make -j8 1> /dev/null & #将标准输出扔掉,将错误输出仍默认输出到终端
另外,对于正在运行的作业,也可以通过 Ctrl+Z 键盘挂起作业,然后通过 bg %jobnumber 来令其在后台运行(相应的,可以使用 fg %jobnumber 令其在前台运行),并可以通过 jobs 命令查看当前挂起和在后台运行的作业。,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
当关闭 shell 窗口时,由于父进程是当前终端 shell 的进程,而一旦父进程退出,则会发送 hangup 信号给所有子进程,子进程收到 hangup 以后也会退出。如果我们要在退出 shell 的时候继续运行进程,则需要使用 nohup 忽略 hangup 信号,或者 setsid 将将父进程设为 init 进程。
但是最好的方式,还是使用 screen
关于后台进程,参见 http://blog.sina.com.cn/s/blog_3e3be35e0100oi9i.html
有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不
再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
#!/bin/sh
一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的
进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
exec与system的区别
(1) exec是直接用新的进程去代替原来的程序运行,运行完毕之后不回到原先的程序中去。
(2) system是调用shell执行你的命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去。继续执行下面的部分。
总之,如果你用exec调用,首先应该fork一个新的进程,然后exec. 而system不需要你fork新进程,已经封装好了。
详见:http://blog.csdn.net/cyberrusher/article/details/7253385
source filename 与 sh filename 及./filename执行脚本的区别在那里呢?source命令也称为"点命令",也就是一个点符号。
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
echo 和 printf
echo 默认结尾带换行符(可以通过 -n 参数取消),而 printf 默认结尾不带换行符。
复制代码
#!/bin/bash
echo Hello,World! # 不能输出分号,因为分号是命令界定符
echo 'Hello,World!' # 不能输出变量值,如 $PATH,只会原形即"$PATH"
echo "Hello,World" # 不能输出 \ 等特殊符号,不过可以使用 set +H 之后改变这一情>况
set +H
echo "Hello,World!"
echo "$PATH"
echo "newline\n\n" # 仍然是不完美的,会直接输出 \n\n 字符,需要加 -e 参数才能识
别转义字符
echo -e "\e[1;31mThis is red text\e[0m"
# 一般 echo 只用于最简单的输出,对于稍微复杂点的输出,请使用 printf
printf "$PATH\nHello,World!\n"
printf "%s\n%s\n" $PATH Hello,World
复制代码
管道符 program1|program2
表示将前者的标准输出重置为后者的标准输入。 < 和 > 和 >> 也可将输入与输出连接到文件,管道却可以把两个执行中的程序衔接到一起
模拟登录脚本:
复制代码
read -p "login as:" login
printf "$login@"
ifconfig eth0 | sed -n "2,2p" | awk '{printf substr($2,6)}'
printf "'s password:"
stty -echo
read password < /dev/tty
printf '\n'
stty echo
复制代码
pgrep 和 pkill
#!/bin/bash
pgrep -l -u root sshd # -l: list 显示进程名,-u 指定进程所属用户,可以简写成 pgrep -luroot sshd
pkill -9 -u root yychat # 等同于 pgrep -uroot yychat | xargs kill -9
pmap : 查看进程的内存映像信息
复制代码
[root@localhost ~]# while true; do pmap -d 27841 | tail -1; sleep 2; done
mapped: 502368K writeable/private: 64024K shared: 0K
mapped: 502368K writeable/private: 64024K shared: 0K
mapped: 502368K writeable/private: 64024K shared: 0K
# mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
# writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
# shared 表示进程和其他进程共享的内存大小
复制代码
read: 从键盘上读取
read var # 从键盘读取字符串放入 var
read -p "login as:" var # -p: 提示信息
read -s "password:" var # -s: 不回显
read -n 2 var # -n: 读取 n 个字符
read -t 3 var # -t: 特定时限(秒)
read -d ":" var # -d: 使用定界符结束输入
IFS: 内部字段分隔符(Internal Field Separator)
复制代码
data="a,b,c"
oldIFS=$IFS
IFS=, # IFS默认值是空白字符(换行符、制表符或空格)
for item in $data
do
echo Item:$item
done;
IFS=$oldIFS
复制代码
if 语句
复制代码
read -p "Enter x:" x
read -p "Enter y:" y
if [ $x > $y ] # 注意 [ ] 与之间的表达式必须要有空格
then
echo "$x>$y"
elif [ $x -lt $y ]
then
echo "$x<$y"
else
echo "$x==$y"
fi
# -eq: == # equal 也可以写成 = ,但注意,= 两边必须有空格,如果没有空格,就是赋值
# -ne: != # not equal
# -gt: > # greater than
# -lt: < # less than
# -ge: >=
# -le: <=
# 简单条件语句的写法:
# [ condition ] && action # 如果 condition 为真,则执行后面语句
# [ condition ] || action # 如果 condition 为假,则执行后面语句
# 此外,逻辑与/逻辑或 也可以写成:
# [ condition1 -a condition2 ] # 逻辑与,或 [ condition1 ] -a [ condition2 ]
# [ condition1 -o condition2 ] # 逻辑或,或 [ condition1 ] -o [ condition2 ]
# 文件系统相关测试:
# [ -f $file_var ]: 如果给定变量包含正常文件路径或文件名,则返回真
# [ -x $file_var ]: 如果给定变量包含的文件可执行,则返回真
# [ -d $file_var ]: 如果给定变量包含的是目录,则返回值,注:如果这里是 -c/-b/-L,则分别对应字符设备文件、块设备文件、符号链接
# [ -e $file_var ]: 如果给定变量包含的文件存在,则返回值
# [ -r $file_var ]: 如果给定变量包含的文件可读,则返回真,注:如果这里是 -w 表示可写
fpath="/etc/passwd"
if [ -e $fpath ];then
echo "File exits";
else
echo "Don't exits";
fi
# -eq: == # equal 也可以写成 = ,但注意,= 两边必须有空格,如果没有空格,就是赋值
# -ne: != # not equal
# -gt: > # greater than
# -lt: < # less than
# -ge: >=
# -le: <=
# 简单条件语句的写法:
# [ condition ] && action # 如果 condition 为真,则执行后面语句
# [ condition ] || action # 如果 condition 为假,则执行后面语句
# 此外,逻辑与/逻辑或 也可以写成:
# [ condition1 -a condition2 ] # 逻辑与,或 [ condition1 ] -a [ condition2 ]
# [ condition1 -o condition2 ] # 逻辑或,或 [ condition1 ] -o [ condition2 ]
# 文件系统相关测试:
# [ -f $file_var ]: 如果给定变量包含正常文件路径或文件名,则返回真
# [ -x $file_var ]: 如果给定变量包含的文件可执行,则返回真
# [ -d $file_var ]: 如果给定变量包含的是目录,则返回值,注:如果这里是 -c/-b/-L,则分别对应字符设备文件、块设备文件、符号链接
# [ -e $file_var ]: 如果给定变量包含的文件存在,则返回值
# [ -r $file_var ]: 如果给定变量包含的文件可读,则返回真,注:如果这里是 -w 表示可写
fpath="/etc/passwd"
if [ -e $fpath ];then
echo "File exits";
else
echo "Don't exits";
fi
# 字符串比较时,最好使用 [[ 和 ]] ,有时采用单中括号可能会有问题
# [[ -n $str ]]: 如果 str 包含的是非空字符串,则返回真
# [[ -z $str ]]: 如果 str 包含的是空字符串,则返回真
# test 用来执行条件检测,有助于过多使用中括号。
if test 3 -gt 1; then
echo "3>1";
fi
复制代码
复合命令:不同命令间用分号隔离,这样会依次执行。
普通用户帐号使用$作为提示符,root帐号使用 # 作为提示符。
shell 登录过程:
1、执行 /etc/profile,同时该文件内会遍历执行 /etc/profile.d/ 下的 *.sh 配置文件。
2、执行 .bash_profile (或 ~/.bash_login 或 ~/.profile),同时该文件内会执行 ~/.bashrc,而该文件内又会调用 /etc/bashrc
3、在退出 shell 时,会执行 ~/.bash_logout
man 有 8 个不同的指南组成:(我感觉下面说得太乱,需要重新找下资料)
1、命令
2、UNIX 系统调用
3、库,用来存储由 C 程序员使用的与内核无关的函数
4、文件格式,如 /etc/passwd 等文件的格式
5、同样是文件格式
6、包括了玩UNIX所带游戏的指令
7、设备驱动程序
8、系统维护
shell 脚本的第一行一般为:
#! /bin/sh
ll /bin/sh 可以发现 sh 是一个指向 bash 的软连接。脚本文件一般有两种运行方式,一种是作为 sh 命令的命令行参数,另一种是将脚本作为具有可执行权限的可执行文件,对于后一种方式来说,上面的那句话就有作用了,它指定了调用哪种解释器来运行脚本。
date:用于显示和设置时间
复制代码
#输出时间:
date #以本地时间格式输出当前时间
date +%s #以时间戳形式输出当前时间
#本地时间格式与时间戳转换:
date +%s -d "2013/9/23 10:40:00" #将指定时间转换成时间戳>格式
date -d @1379895103 #指定时间戳转换成本地时间格式
#设置时间:
date -s 2013/9/23 # date -s 2013-9-23
date -s 10:30:00
date -s "2013/9/23 10:30:00"
复制代码
time:计算某一任务运行的时间。通过 type -a time 查看,可以发现 linux 中有两个 time,还有一个是 /usr/bin/time ,没有可安装,它显示的信息比下面会更多一些,包括一些CPU占用和IO等情况,使用方法如 /usr/bin/time -v make -j4,此处略过。
复制代码
# TIMEFORMAT 环境变量用来自定义输出的时间格式
export TIMEFORMAT=$'real %2R\nuser %2U\nsys %2S' # 有 -p 参数的时间格式
time date
export TIMEFORMAT=$'real %2R\n' # 只输出 real 时间
time date
export TIMEFORMAT=$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS' #默认时间格式
time date
time -p date # -p 参数可以指定以 POSIX 缺省时间格式打印结果,单位为秒
复制代码
who: show who is logged on
who -aH #输出系统上次引导时间、当前运行级别和当前登陆用户,及其它用户登陆信息,-H 表示显示表头(即标题)
who -b # -b: boot 上次引导时间
who -r # -r: run 当前运行级别,同 runlevel
who -u # -u: user 当前登录用户
whoami # 只输出当前登录用户的用户名
wc 计算机文件中的行数、单词数和字符数
wc -l /etc/passwd # -l: line 行数
wc -w /etc/passwd # -w: word 行数
wc -c /etc/passwd # -c: char 行数
wc -l ~/code/src/*.cpp # 依次输出 ~/code/src/*.cpp 的行数与总量
ls -l *.cpp | wc -l # 查看当前目录有多少个 *.cpp 文件
cp 复制命令
cp -u # -u: update 当源文件比目标文件新的时候,才复制
cp -p # -p: preserve 保持源文件的属性:模式,所有权,时间戳
cp -s # -s: symbolic-link 软连接,同 ln -s ,ln 默认为硬连接
注:硬连接(Hard Link):硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接(Symbolic Link):软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
mkdir 创建目录
mkdir -pv -m=rwx test/test
# -p: parents 两个作用:1、可以创建需要的多级目录。2、即使目录存在,也不报错
# -v: verbose 创建详情,如果创建成功则输出信息
# -m: mode 创建时赋予权限,同 chmod
不同文件的特殊字符标识:可以通过 ls 命令查看,也可以通过 file 命令。
复制代码
- # 普通文件,如文本文件,二进制文件等
d # 目录
l # 符号连接文件(软连接)
c # 字符特殊文件,提供对设备不带缓冲的访问,每次访问长度可变。
b # 块特殊文件,提供对设备带缓冲的访问,每次访问以固定长度为单位进行。
p # 命名管道,用于进程间通信(IPC)
s # sockek,用于进程间网络通信
复制代码
chmod 修改权限
chmod 777 src # 777 分别设置 user\group\other 三者(all)权限,八进制方式,1表示执行,2表示写,4表示读,相加得复合权限,八进制方式只能设置权限,而不能增加或去除权限
chmod a-x src # =/+/- rwx 用于赋予或增加或去除权限,a 表示 all,也可为 u,g,o ,也可写成 ugo-x,默认不写为 a
chmod u+rwx,g+x,o=rw src # 同上,可以在一起分别设置
chmod a+x -R src # 递归修改目录权限
chmod a+x -v src # 输出修改成功后的权限信息
chown 和 chgrp : 修改所有者和所有组
chown -v -R root filename # 修改所有者 -R 表示递归修改,-v 输出修改结果
chown -v root:root filename # 修改所有者和所有组
chown -v :root filename # 只修改所有组,同 chgrp
chgrp -v root filename # 同上
后台进程:
可以在执行命令时,在命令后面加上 & 符号,使其在后台运行。如 make & ,但作业在后台运行一样会将结果输出到屏幕上,干扰工作。可以通过如下方式,把输出重定向到文件:
make -j8 > result 2>&1 &
make -j8 1> /dev/null & #将标准输出扔掉,将错误输出仍默认输出到终端
另外,对于正在运行的作业,也可以通过 Ctrl+Z 键盘挂起作业,然后通过 bg %jobnumber 来令其在后台运行(相应的,可以使用 fg %jobnumber 令其在前台运行),并可以通过 jobs 命令查看当前挂起和在后台运行的作业。,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
当关闭 shell 窗口时,由于父进程是当前终端 shell 的进程,而一旦父进程退出,则会发送 hangup 信号给所有子进程,子进程收到 hangup 以后也会退出。如果我们要在退出 shell 的时候继续运行进程,则需要使用 nohup 忽略 hangup 信号,或者 setsid 将将父进程设为 init 进程。
但是最好的方式,还是使用 screen
关于后台进程,参见 http://blog.sina.com.cn/s/blog_3e3be35e0100oi9i.html
有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts;一种是在当前shell下执行,不
再启用其他shell。
新产生一个shell然后再执行scripts的方法是在scripts文件开头加入以下语句
#!/bin/sh
一般的script文件(.sh)即是这种用法。这种方法先启用新的sub-shell(新的子进程),然后在其下执行命令。
另外一种方法就是上面说过的source命令,不再产生新的shell,而在当前shell下执行一切命令。
exec命令在执行时会把当前的shell process关闭,然后换到后面的命令继续执行。系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的
进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
exec与system的区别
(1) exec是直接用新的进程去代替原来的程序运行,运行完毕之后不回到原先的程序中去。
(2) system是调用shell执行你的命令,system=fork+exec+waitpid,执行完毕之后,回到原先的程序中去。继续执行下面的部分。
总之,如果你用exec调用,首先应该fork一个新的进程,然后exec. 而system不需要你fork新进程,已经封装好了。
详见:http://blog.csdn.net/cyberrusher/article/details/7253385
source filename 与 sh filename 及./filename执行脚本的区别在那里呢?source命令也称为"点命令",也就是一个点符号。
1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。
2.sh filename 重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell,除非使用export。
3.source filename:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
echo 和 printf
echo 默认结尾带换行符(可以通过 -n 参数取消),而 printf 默认结尾不带换行符。
复制代码
#!/bin/bash
echo Hello,World! # 不能输出分号,因为分号是命令界定符
echo 'Hello,World!' # 不能输出变量值,如 $PATH,只会原形即"$PATH"
echo "Hello,World" # 不能输出 \ 等特殊符号,不过可以使用 set +H 之后改变这一情>况
set +H
echo "Hello,World!"
echo "$PATH"
echo "newline\n\n" # 仍然是不完美的,会直接输出 \n\n 字符,需要加 -e 参数才能识
别转义字符
echo -e "\e[1;31mThis is red text\e[0m"
# 一般 echo 只用于最简单的输出,对于稍微复杂点的输出,请使用 printf
printf "$PATH\nHello,World!\n"
printf "%s\n%s\n" $PATH Hello,World
复制代码
管道符 program1|program2
表示将前者的标准输出重置为后者的标准输入。 < 和 > 和 >> 也可将输入与输出连接到文件,管道却可以把两个执行中的程序衔接到一起
模拟登录脚本:
复制代码
read -p "login as:" login
printf "$login@"
ifconfig eth0 | sed -n "2,2p" | awk '{printf substr($2,6)}'
printf "'s password:"
stty -echo
read password < /dev/tty
printf '\n'
stty echo
复制代码
pgrep 和 pkill
#!/bin/bash
pgrep -l -u root sshd # -l: list 显示进程名,-u 指定进程所属用户,可以简写成 pgrep -luroot sshd
pkill -9 -u root yychat # 等同于 pgrep -uroot yychat | xargs kill -9
pmap : 查看进程的内存映像信息
复制代码
[root@localhost ~]# while true; do pmap -d 27841 | tail -1; sleep 2; done
mapped: 502368K writeable/private: 64024K shared: 0K
mapped: 502368K writeable/private: 64024K shared: 0K
mapped: 502368K writeable/private: 64024K shared: 0K
# mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
# writeable/private 表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小
# shared 表示进程和其他进程共享的内存大小
复制代码
read: 从键盘上读取
read var # 从键盘读取字符串放入 var
read -p "login as:" var # -p: 提示信息
read -s "password:" var # -s: 不回显
read -n 2 var # -n: 读取 n 个字符
read -t 3 var # -t: 特定时限(秒)
read -d ":" var # -d: 使用定界符结束输入
IFS: 内部字段分隔符(Internal Field Separator)
复制代码
data="a,b,c"
oldIFS=$IFS
IFS=, # IFS默认值是空白字符(换行符、制表符或空格)
for item in $data
do
echo Item:$item
done;
IFS=$oldIFS
复制代码
if 语句
复制代码
read -p "Enter x:" x
read -p "Enter y:" y
if [ $x > $y ] # 注意 [ ] 与之间的表达式必须要有空格
then
echo "$x>$y"
elif [ $x -lt $y ]
then
echo "$x<$y"
else
echo "$x==$y"
fi
# -eq: == # equal 也可以写成 = ,但注意,= 两边必须有空格,如果没有空格,就是赋值
# -ne: != # not equal
# -gt: > # greater than
# -lt: < # less than
# -ge: >=
# -le: <=
# 简单条件语句的写法:
# [ condition ] && action # 如果 condition 为真,则执行后面语句
# [ condition ] || action # 如果 condition 为假,则执行后面语句
# 此外,逻辑与/逻辑或 也可以写成:
# [ condition1 -a condition2 ] # 逻辑与,或 [ condition1 ] -a [ condition2 ]
# [ condition1 -o condition2 ] # 逻辑或,或 [ condition1 ] -o [ condition2 ]
# 文件系统相关测试:
# [ -f $file_var ]: 如果给定变量包含正常文件路径或文件名,则返回真
# [ -x $file_var ]: 如果给定变量包含的文件可执行,则返回真
# [ -d $file_var ]: 如果给定变量包含的是目录,则返回值,注:如果这里是 -c/-b/-L,则分别对应字符设备文件、块设备文件、符号链接
# [ -e $file_var ]: 如果给定变量包含的文件存在,则返回值
# [ -r $file_var ]: 如果给定变量包含的文件可读,则返回真,注:如果这里是 -w 表示可写
fpath="/etc/passwd"
if [ -e $fpath ];then
echo "File exits";
else
echo "Don't exits";
fi
# -eq: == # equal 也可以写成 = ,但注意,= 两边必须有空格,如果没有空格,就是赋值
# -ne: != # not equal
# -gt: > # greater than
# -lt: < # less than
# -ge: >=
# -le: <=
# 简单条件语句的写法:
# [ condition ] && action # 如果 condition 为真,则执行后面语句
# [ condition ] || action # 如果 condition 为假,则执行后面语句
# 此外,逻辑与/逻辑或 也可以写成:
# [ condition1 -a condition2 ] # 逻辑与,或 [ condition1 ] -a [ condition2 ]
# [ condition1 -o condition2 ] # 逻辑或,或 [ condition1 ] -o [ condition2 ]
# 文件系统相关测试:
# [ -f $file_var ]: 如果给定变量包含正常文件路径或文件名,则返回真
# [ -x $file_var ]: 如果给定变量包含的文件可执行,则返回真
# [ -d $file_var ]: 如果给定变量包含的是目录,则返回值,注:如果这里是 -c/-b/-L,则分别对应字符设备文件、块设备文件、符号链接
# [ -e $file_var ]: 如果给定变量包含的文件存在,则返回值
# [ -r $file_var ]: 如果给定变量包含的文件可读,则返回真,注:如果这里是 -w 表示可写
fpath="/etc/passwd"
if [ -e $fpath ];then
echo "File exits";
else
echo "Don't exits";
fi
# 字符串比较时,最好使用 [[ 和 ]] ,有时采用单中括号可能会有问题
# [[ -n $str ]]: 如果 str 包含的是非空字符串,则返回真
# [[ -z $str ]]: 如果 str 包含的是空字符串,则返回真
# test 用来执行条件检测,有助于过多使用中括号。
if test 3 -gt 1; then
echo "3>1";
fi
复制代码
复合命令:不同命令间用分号隔离,这样会依次执行。
普通用户帐号使用$作为提示符,root帐号使用 # 作为提示符。
shell 登录过程:
1、执行 /etc/profile,同时该文件内会遍历执行 /etc/profile.d/ 下的 *.sh 配置文件。
2、执行 .bash_profile (或 ~/.bash_login 或 ~/.profile),同时该文件内会执行 ~/.bashrc,而该文件内又会调用 /etc/bashrc
3、在退出 shell 时,会执行 ~/.bash_logout
man 有 8 个不同的指南组成:(我感觉下面说得太乱,需要重新找下资料)
1、命令
2、UNIX 系统调用
3、库,用来存储由 C 程序员使用的与内核无关的函数
4、文件格式,如 /etc/passwd 等文件的格式
5、同样是文件格式
6、包括了玩UNIX所带游戏的指令
7、设备驱动程序
8、系统维护
相关推荐
shell脚本 是一种shell编写的脚本程序。 shell编程跟Java、PHP 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执 行的脚本解释器就可以了。 为什么要学习和使用shell? Shell属于内置的脚本 程序开发...
精心整理shell脚本100例(最新版).pdf
- CLI Shell允许用户通过键入命令来完成任务,这种方式在自动化脚本编写、远程管理等方面具有很高的灵活性。 #### 二、常用Shell命令 接下来我们将详细介绍一些常用的Shell命令及其应用场景。 ##### 1. `ls` ...
这个"精心整理shell脚本100例(最新版).zip"文件很可能包含了各种实用且具有代表性的Shell脚本实例,帮助用户更好地理解和掌握Shell编程技巧。 1. **基础概念** - **Shell**: 是操作系统提供的一个命令解释器,它...
### Shell常用命令整理 在日常的Linux系统管理与开发工作中,掌握一些基本的Shell命令是非常必要的。这些命令可以帮助我们高效地完成各种任务,比如文件管理、目录导航等。接下来,我们将详细介绍几个常用的Shell...
综上所述,"shell脚本编程02"涵盖了变量替换、文件批量操作、子串处理以及内部命令变量的高级应用,这些都是编写高效shell脚本必不可少的知识点。通过学习和实践这些内容,你将能够更好地驾驭Linux环境下的自动化...
在IT行业中,自动化监控是确保系统稳定运行的关键环节...总结来说,这个Shell脚本是RabbitMQ监控的一个实用工具,它结合了Shell脚本的灵活性和RabbitMQ的监控功能,能够帮助IT团队更好地管理和维护他们的消息队列服务。
Shell脚本是一种用来自动化执行命令的程序,通常用于Linux/Unix系统。它提供了一种编程方式,允许用户将一系列的Linux命令和决策点组合在一起,以便在遇到特定条件时执行。在学习Shell脚本编程时,可以按照《Linux...
Shell 命令手册是对 shell 命令的分类和整理,对需要使用 shell 脚本的人员非常实用。本手册涵盖了 Linux 系统管理命令、文件管理命令、处理命令、网络命令、安全命令等多个方面的命令,总计超过 100 个命令。 在 ...
**Shell 脚本大全** 精心收集、整理了 Linux 环境下的常见 Shell 脚本操作片段。 当您面临以下问题时,**Shell 脚本大全** 也许可以给你一些借鉴: - 你想要执行某个操作,却不知 Shell 命令如何写 - 你想要快速掌握...
android开发中有很多实用的shell命令,可以减少我们在手机端的操作,提高开发效率,我将我在工作中常用的shell命令收集整理封装成脚本,作一个分享.
4. **数据存储**:将整理好的信息追加至CSV文件中,便于长期趋势分析。 #### 定期检查脚本 该脚本设计用于定期执行系统检查任务,确保系统日志和数据的完整性: 1. **时间戳生成**:生成当前的年月日和小时信息。...
在本资料包中,"linux常用shell脚本"包含了个人整理的运维必备脚本和配置,让我们一起深入探讨一下这个领域的知识。 1. **Shell基础知识** - **Shell类型**:主要有Bash(Bourne-Again SHell)、Sh(Bourne Shell...
8. `source` 命令:读取并执行指定的Shell脚本,将脚本中的环境变量设置应用到当前Shell环境中。 9. `cut` 命令:用于从文件或标准输入中提取指定字段,例如 `echo $PATH | cut -d ':' -f 3,5` 提取环境变量`PATH`...
"shell编程打包整理"这个主题涵盖了对Shell脚本编写、调试、优化和组织的知识点。 首先,让我们了解什么是Shell。Shell是操作系统提供的一种命令行界面,用户可以通过它来执行系统命令、操作文件和控制程序。在...
### Shell脚本实现从文件夹中递归复制文件 #### 背景介绍 在日常工作中,有时我们可能需要从多层嵌套的文件夹结构中提取特定的文件或者进行数据整理工作。对于这种需求,手动操作显然是低效且耗时的。此时,利用...
【标题】"Linux学习资料(精心整理)服务器搭建 shell脚本 c语言"涵盖了Linux系统学习的几个关键领域,包括Linux服务器的搭建、shell脚本的编写以及C语言的基础与应用。这些主题对于IT专业人士,尤其是那些希望提升...
shell从入门到应用,也包含AWK sed等操作,提供课件以及各种完整脚本以便学习。此课件视频来源于B站,链接为:https://www.bilibili.com/video/BV1st411N7WS?from=search&seid=5240570590491899209。
四川大学IT企业实训,拓思爱诺大数据作业1,HDFS shell命令整理